通过卷积操作固定/冻结单个内核权重

时间:2019-04-20 23:43:10

标签: python-3.x tensorflow conv-neural-network

我正在尝试一种变通方法,用于使用Python 3.7在TensorFlow的卷积操作中固定单个内核权重。我通过创建

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

“遮罩”张量中的 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 的位置上获得零值梯度,但是它们不是零,因此这些权重正在训练中,这不是我要达到的目的。

0 个答案:

没有答案