2017-03-17 6 views
5

2つのconvレイヤーを同じウェイトで共有しようとしていますが、APIが動作しないようです。tf.layers.conv2dでTensorFlowを再利用する変数

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) 

それは問題を解決していませんtf.contrib.layers.conv2dからtf.layers.conv2dに変更

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

出力します。

それは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 
+0

最初の例ではなぜ最初のconvでも本当に再利用されますか? – Steven

+0

@Steven私はr​​euse = Trueを入れるためにすべての組み合わせを試しましたが、どれも有効ではありませんでした。 tf.layers.conv2dを使用してウェイトをどのように共有するかの簡単な例を教えてください。 – Xingdong

+0

私は通常、手で行います。つまり、ウエイトを作成して渡します。次に、同じ変数を使用するだけで再利用できるウエイト変数があります。私はそれの例を示すことができますか? – Steven

答えて

9

を与え、変数が2つの畳み込み層の間に再利用されますか。これを試してみてください:

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'] 

1つの重みと1つのバイアステンソルしか作成されていません。たとえ彼らが重みを共有しても、層は実際の計算を共有しません。したがって、操作の2つの異なる名前が表示されます。

+2

'reuse = tf.AUTO_REUSE'を設定することができるので、最初の呼び出しでは' False'/'None'に設定し、その後の呼び出しでは' True'に設定する必要はありません。これにより、最初の呼び出しで特別なケースが必要なくなります。 – Nathan

関連する問題