2017-04-13 4 views
5

मेरे पास टेन्सफोर्लो में एक नेटवर्क है, और मैं एक ऐसे फ़ंक्शन को परिभाषित करना चाहता हूं जो tf.layers.dense परत (जाहिर है, वही एक) के माध्यम से इसका इनपुट पास करता है। मुझे reuse तर्क दिखाई देता है, लेकिन इसे सही तरीके से उपयोग करने के लिए ऐसा लगता है कि मुझे एक वैश्विक चर रखने की आवश्यकता है, बस याद रखें कि मेरा फ़ंक्शन पहले से ही कहलाता है या नहीं। क्या कोई क्लीनर तरीका है?मैं एक घने परत का पुन: उपयोग कैसे कर सकता हूं?

उत्तर

4

जहां तक ​​मुझे पता है, कोई क्लीनर तरीका नहीं है।

def my_dense(*args, **kwargs): 
    scope = tf.variable_scope(None, default_name='dense').__enter__() 
    def f(input): 
    r = tf.layers.dense(input, *args, name=scope, **kwargs) 
    scope.reuse_variables() 
    return r 
    return f 

a = [[1,2,3], [4,5,6]] 
a = tf.constant(a, dtype=tf.float32) 
layer = my_dense(3) 
a = layer(a) 
a = layer(a) 

print(*[[int(a) for a in v.get_shape()] for v in tf.trainable_variables()]) 
# Prints: "[3, 3] [3]" (one pair of (weights and biases)) 
+1

वाह, यह साफ है। बहुत साफ है कि गड़बड़ मैं खत्म हो गया! – Akiiino

+1

आपको कुछ नाम 'my_dense' पर पास करना चाहिए ताकि विभिन्न परतों के लिए इस चाल का उपयोग करना संभव हो। – Sorin

4

आप सही आकार की एक निरंतर के खिलाफ परत का निर्माण कर सकता है और परिणाम की अनदेखी: सबसे अच्छा हम कर सकते हैं हमारे अमूर्त में tf.layers.dense लपेट और एक वस्तु के रूप में उपयोग, छुपा variable scope की रीढ़ है।

इस प्रकार चर को घोषित किया गया है लेकिन ऑपरेशन को ग्राफ से हटाया जाना चाहिए।

उदाहरण

tf.layers.dense(tf.zeros(1, 128), 3, name='my_layer') 

... later 
hidden = tf.layers.dense(input, 3, name='my_layer', reuse=True) 
0

के लिए मैं tf.layers.Dense ऊपर जवाब से क्लीनर पाते हैं। आपको केवल एक घन वस्तु की आवश्यकता है जिसे पहले परिभाषित किया गया है। फिर आप इसे कई बार पुन: उपयोग कर सकते हैं।

import tensorflow as tf 

# Define Dense object which is reusable 
my_dense = tf.layers.Dense(3, name="optional_name") 

# Define some inputs 
x1 = tf.constant([[1,2,3], [4,5,6]], dtype=tf.float32) 
x2 = tf.constant([[4,5,6], [7,8,9]], dtype=tf.float32) 

# Use the Dense layer 
y1 = my_dense(x1) 
y2 = my_dense(x2) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    y1 = sess.run(y1) 
    y2 = sess.run(y2) 
    print(y1) 
    print(y2) 

वास्तव में tf.layers.dense समारोह आंतरिक रूप से एक घने वस्तु निर्माण करती है और उस वस्तु को अपने इनपुट गुजरती हैं। अधिक जानकारी के लिए, code देखें।

संबंधित मुद्दे