我需要为此操作添加自定义渐变吗?

Do I need to add custom gradients for this op?

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

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

或者,我可以先把16张图全部乘以一个mask,然后把结果分成4组,每组做reduce_sum。生成的 4 个映射将用作下一个卷积层或池化层的输入。

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

编辑:这是一系列操作,其中 convtf.layers.conv2d 的输出,mask 是与 conv 形状相同的二进制 numpy 数组(完整代码为here):

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)

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

此外,如您所见,tensorflow 重载了基本操作。

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 总是被接受,所以我会避免它。

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