如何在Keras Tensorflow中创建用于采样的自定义图层?

时间:2019-03-07 14:47:00

标签: python tensorflow keras pytorch sampling

我正在Keras中使用Tensorflow后端构建CNN,我想介绍一个自定义图层,该图层应执行以下操作:

  • 输出与输入张量相同形状和dtype的张量。
  • 输出由输入张量的几个样本组成,例如25%。输出张量的其余部分应为零。
  • 必须随机抽取样本,以便以较高的概率对最高像素进行采样。换句话说,概率分布应该是输入张量本身(规范化)。

就目前而言,我设法构建了一个模型,在该模型中,我选择了输入张量的前25%像素,并仅从它们中创建了相同大小的输出张量。但这不是随机抽样。

理想情况下,我想使用张量流等效项:np.random.choice(input_tensor, num_samples, input_tensor_normalized),其中第三个参数是要遵循的概率分布。请注意,这仅适用于一维np.array。

我听说过tf.random.multinomial,但是它已经贬值了,tf.random.categoricallogits作为输入(我不认为这是我的情况),并且没有提出概率分布。

一种可能是将输入张量整形为向量,如果可以的话,在Tensorflow中执行一维采样,构造一个相似的向量,其采样值在相应的索引处为零,然后在其他位置为零,然后再将其整形为张量。

还有其他想法吗?

我应该搬到PyTorch吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

您仍然可以使用tf.random.categorical。 logits只是未归一化的日志概率。因此,如果您已经准备好进行概率分布,则可以执行以下操作:

samples = tf.random.categorical(tf.log(input_tensor_normalized), num_samples)