我正在尝试一种变通方法,用于使用Python 3.7在TensorFlow的卷积操作中固定单个内核权重。我通过创建
“遮罩”张量中的 1 表示我要在训练过程中固定/冻结该特定重量,即不要在向后传递中更新它。
现在,这种解决方法在应用于完全连接的层时可以很好地工作,但是在应用于卷积层时会失败,而且我不知道为什么或如何使其起作用。
tf.nn.conv2d()函数调用中似乎正在发生某些事情(请参见下面的代码示例),并且根据文档,这是它们的工作:
给出形状为
[batch, in_height, in_width, in_channels]
的输入张量
和形状的过滤器/内核张量
[filter_height, filter_width, in_channels, out_channels]
,此操作
执行以下操作:
1.将滤镜展平为具有形状的二维矩阵
[filter_height * filter_width * in_channels, output_channels]
。
2.从输入张量中提取图像补丁以形成 virtual
形状为[batch, out_height, out_width,<br> filter_height * filter_width * in_channels]
的张量。
3.对于每个色块,将滤镜矩阵和图像色块右乘
向量。
但是由于我使用的是张量的 weights_frozen ,并且取决于可训练变量,不可训练变量和 mask_weights ,因此应该在以下位置获得零值渐变我的 mask_weights 张量中为1。
def conv(input_, layer_name...):
weights = tf.get_variable(shape=[filter_height, filter_width, in_channels, out_channels], dtype=tf.float32, initializer=tf.glorot_uniform_initializer(), trainable=True)
weights_fixed = tf.Variable(tf.identity(weights), trainable=False)
mask_weights = tf.placeholder(tf.float32, weights.shape)
weights_frozen = tf.add(tf.multiply(mask_weights, weights_fixed), tf.multiply((1 - mask_weights), weights))
out_conv = tf.nn.conv2d(input=input_, filter=weights_frozen, strides=strides_, padding='SAME')
out_add = tf.nn.bias_add(value=out_conv, bias=biases_frozen)
out = tf.nn.relu(features=out_add)
return out
如前所述,我希望在 mask_weights 张量中具有 1 的位置上获得零值梯度,但是它们不是零,因此这些权重正在训练中,这不是我要达到的目的。