1

我有一个卷积层,它产生 16 个输出特征图,我想把这些图转换成 4 个图,如下所示:

  1. 将 16 个特征图分成 4 组,每组 4 个图。
  2. 将每个组乘以掩码以将某些值清零。
  3. 在每组中添加生成的特征图以获得 4 个图。

或者,我可以先将所有 16 个映射乘以一个掩码,然后将结果分成 4 个组,对每个组进行 reduce_sum。生成的 4 个映射将用作下一个卷积或池化层的输入。

Tensorflow 是否能够自动计算 tf.split、tf.multiply 和 tf.reduce_sum 组合的梯度?

编辑:这是一系列操作,其中conv是 的输出tf.layers.conv2d,并且mask是形状相同的二进制 numpy 数组conv (完整代码在此处):

conv_masked = mask * conv
conv_grouped = tf.reshape(conv_masked, (batch_size, num_groups, fs*fs, dim, dim))
out = tf.reduce_sum(conv_grouped, axis=2)
4

1 回答 1

2

所有 tensorflow 操作都已经实现了梯度公式。只要你所有的操作都是 tf.operation,你就可以了。

此外,正如您在此处看到的,张量流重载了基本操作。

masked_tensor = tensor * mask
masked_tensor = tf.multiply(tensor, mask)

如果涉及的元素是张量,那么上面的两个表达式是等价的。

至于被用于口罩的类型

mask = tf.constant(array)
mask = np.array(array)

对我来说,使用 python 3.6.3 和 tensorflow 1.3.0 都从操作中生成了相同的结果。但是我在文档中没有发现任何明确说明 np.arrays 总是被接受的,所以我会避免它。

不过需要注意的一点是,您要乘以的掩码应该是不可训练的变量。否则优化器会改变你的掩码。

于 2018-02-10T01:32:29.987 回答