2017-03-17 97 views
5

我想讓2個conv層共享相同的權重,但是,它似乎API不起作用。TensorFlow重用變量與tf.layers.conv2d

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.conv2dtf.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 
+0

第一個例子爲什麼即使在第一個conv上重用也是如此? – Steven

+0

@Steven我已經嘗試過所有的組合,以重用=真,但沒有一個是有效的。你能幫忙舉一個簡單的例子來說明如何通過使用tf.layers.conv2d來使權重共享嗎? – Xingdong

+0

我通常通過手工完成,即創建權重,然後將其傳入。然後,我可以通過簡單地使用相同變量重新使用權重變量。我可以舉一個例子嗎? – Steven

回答

9

在你寫的代碼,變量做得到兩個卷積層之間重用。試試這個:

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

請注意,只有一個權重和一個偏置張量已經創建。即使它們共享權重,圖層也不共享實際的計算。因此你可以看到兩個不同的操作名稱。

+2

請注意,您可以設置'reuse = tf.AUTO_REUSE',這樣您就不必在第一次調用時將其設置爲「False」/「None」,然後將其設置爲「True」。這使您不需要第一個電話的特殊情況。 – Nathan