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

时间:2018-02-09 22:35:58

标签: tensorflow autodiff

我有一个卷积层,它产生16个输出要素图,我想拍摄这些地图并将它们转换成4个这样的地图:

  1. 将16个要素图分成4组,每组4个。
  2. 将每个组乘以一个掩码,将某些值清零。
  3. 在每个组中添加生成的要素图以获得4个地图。
  4. 或者,我可以先用掩码将所有16个地图相乘,然后将结果分成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)
    

1 个答案:

答案 0 :(得分:1)

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

另外,正如您所见,here,tensorflow会重载基本操作。

fix

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

用于面具的类型

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

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

但有一点需要注意的是,你所乘的面具应该是一个不可训练的变量。否则优化器将改变你的掩码。