2017-03-17 8 views
5

मैं 2 वें परतों को समान वजन साझा करने की कोशिश कर रहा हूं, हालांकि, ऐसा लगता है कि एपीआई काम नहीं करता है।tensorFlow ref variable 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.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 
+0

पहले उदाहरण के लिए पहले रूपांतरण पर भी सही क्यों उपयोग किया जाता है? – Steven

+0

@ स्टेवन मैंने पुन: उपयोग करने के लिए सभी संयोजनों को आजमाया है = सही है, लेकिन उनमें से कोई भी प्रभावी नहीं है। क्या आप 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' सेट कर सकते हैं ताकि आपको इसे पहले कॉल के लिए' गलत '/ 'कोई नहीं' पर सेट करने की आवश्यकता न हो, फिर बाद वाले लोगों के लिए 'True'। यह आपको पहली कॉल के लिए एक विशेष मामले की आवश्यकता से बचाता है। – Nathan