TensorFlow reuse variable with tf.layers.conv2d



我正在尝试使 2 个 conv 层共享相同的权重,但是,API 似乎不起作用。

import tensorflow as tf
x = tf.random_normal(shape=[10, 32, 32, 3])
with tf.variable_scope('foo') as scope:
    conv1 = tf.contrib.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=True, scope=scope)
    print(conv1.name)
    conv2 = tf.contrib.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=True, scope=scope)
    print(conv2.name)

它打印出来

foo/foo/Relu:0
foo/foo_1/Relu:0

tf.contrib.layers.conv2d更改为tf.layers.conv2d并不能解决问题。

它与tf.layers.conv2d有相同的问题:

import tensorflow as tf
x = tf.random_normal(shape=[10, 32, 32, 3])
conv1 = tf.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=None, name='conv')
print(conv1.name)
conv2 = tf.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=True, name='conv')
print(conv2.name)

conv/BiasAdd:0
conv_2/BiasAdd:0

在您编写的代码中,变量确实会在两个卷积层之间重用。试试这个:

import tensorflow as tf
x = tf.random_normal(shape=[10, 32, 32, 3])
conv1 = tf.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=None, name='conv')
conv2 = tf.layers.conv2d(x, 3, [2, 2], padding='SAME', reuse=True, name='conv')
print([x.name for x in tf.global_variables()])
# prints
# [u'conv/kernel:0', u'conv/bias:0']

请注意,只创建了一个权重和一个偏向张量。即使它们共享权重,这些层也不会共享实际计算。因此,您会看到操作的两个不同名称。

最新更新