我需要为此操作添加自定义渐变吗?
Do I need to add custom gradients for this op?
我有一个卷积层,它产生 16 个输出特征图,我想把这些图转换成 4 个这样的图:
- 将16张特征图分成4组,每组4张图。
- 将每个组乘以一个掩码以将一些值清零。
- 在每组中添加生成的特征图,得到 4 个图。
或者,我可以先把16张图全部乘以一个mask,然后把结果分成4组,每组做reduce_sum。生成的 4 个映射将用作下一个卷积层或池化层的输入。
Tensorflow 能否自动计算 tf.split、tf.multiply 和 tf.reduce_sum 的这种组合的梯度?
编辑:这是一系列操作,其中 conv
是 tf.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 总是被接受,所以我会避免它。
但需要注意的一点是,您要乘以的掩码应该是不可训练的变量。否则优化器会改变你的掩码。
我有一个卷积层,它产生 16 个输出特征图,我想把这些图转换成 4 个这样的图:
- 将16张特征图分成4组,每组4张图。
- 将每个组乘以一个掩码以将一些值清零。
- 在每组中添加生成的特征图,得到 4 个图。
或者,我可以先把16张图全部乘以一个mask,然后把结果分成4组,每组做reduce_sum。生成的 4 个映射将用作下一个卷积层或池化层的输入。
Tensorflow 能否自动计算 tf.split、tf.multiply 和 tf.reduce_sum 的这种组合的梯度?
编辑:这是一系列操作,其中 conv
是 tf.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就可以了
此外,如您所见
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 总是被接受,所以我会避免它。
但需要注意的一点是,您要乘以的掩码应该是不可训练的变量。否则优化器会改变你的掩码。