首页 > 解决方案 > 在卷积操作中修复/冻结单个内核权重

问题描述

我正在尝试一种解决方法,以使用 Python 3.7 在 TensorFlow 中的卷积运算中修复单个内核权重。我通过创造来做到这一点

  1. 一个可训练的变量,
  2. 一个相同的不可训练变量和
  3. 由10组成的“掩码”张量,其形状与上述步骤 1 和 2 中创建的变量相同。

“掩码”张量中的1表示我想在训练期间修复/冻结该特定权重,即不在后向传递中更新它。

现在,这种解决方法在应用于全连接层时工作得非常好,但在应用于卷积层时会失败,我不知道为什么或如何使它工作。

tf.nn.conv2d()函数调用中似乎发生了一些事情(参见下面的代码示例),根据文档,这就是他们所做的:

给定一个 shape 的输入张量[batch, in_height, in_width, in_channels]
和一个 shape 的过滤器/内核张量
[filter_height, filter_width, in_channels, out_channels],此操作
执行以下操作:
1. 将过滤器展平为一个具有 shape 的二维矩阵
[filter_height * filter_width * in_channels, output_channels]
2. 从输入张量中提取图像块,形成形状为 的虚拟
张量[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的位置获得零值梯度,但它们不是零,因此正在训练这些权重,这不是我想要实现的行为.

标签: python-3.xtensorflowconv-neural-network

解决方案


推荐阅读