2015-12-29 44 views
7

में टेंसर की एक सूची के बराबर है मेरे पास एक गहरा तंत्रिका नेटवर्क है जहां परतों के बीच वजन सूची में संग्रहीत किया जाता है।tensorflow

layers[j].weights मैं अपने लागत समारोह में रिज जुर्माना लगा सकता हूं। मुझे tf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers)) यानी सभी वजनों के वर्ग योग का उपयोग करने की आवश्यकता है।

>>> avs.layers 
[<neural_network.Layer object at 0x10a4b2a90>, <neural_network.Layer object at 0x10ac85080>, <neural_network.Layer object at 0x10b0f3278>, <neural_network.Layer object at 0x10b0eacf8>, <neural_network.Layer object at 0x10b145588>, <neural_network.Layer object at 0x10b165048>, <neural_network.Layer object at 0x10b155ba8>] 
>>> 
>>> avs.layers[0].weights 
<tensorflow.python.ops.variables.Variable object at 0x10b026748> 
>>> 

मैं कैसे tensorflow में ऐसा कर सकते हैं:

विशेष रूप से वजन के रूप में परिभाषित कर रहे हैं?

+0

मुझे लगता है कि आपको उन वजनों में से एक नया टेंसर बनाने और लागत समीकरण में उपयोग करने की आवश्यकता है। – fabrizioM

उत्तर

16

टेंसर की सूची को समेटने का मानक तरीका tf.add_n() ऑपरेशन का उपयोग करना है, जो टेंसर की सूची लेता है (प्रत्येक का आकार और आकार होता है) और योग युक्त एक एकल टेंसर उत्पन्न करता है।

आपके पास विशेष समस्या के लिए, मुझे लगता है कि प्रत्येक layers[j].weights का एक अलग आकार हो सकता है। इसलिए आपको संक्षेप में प्रत्येक तत्व को स्केलर से कम करने की आवश्यकता होगी, उदाहरण के लिए tf.nn.l2_loss() समारोह में ही उपयोग करते हुए:

weights = [layers[j].weights for j in range(self.n_layers)] 
losses = [tf.nn.l2_loss(w) for w in weights] 
total_loss = tf.add_n(losses) 

(ध्यान दें लेकिन जब मूल्यों जोड़े जाने के लिए बड़े हैं, आप इसे और अधिक tf.add() आपरेशन के एक दृश्य की गणना करने के कुशल पा सकते हैं कि जब से TensorFlow add_n में से प्रत्येक के मूल्यों रहता है उन सभी को जब तक स्मृति में तर्क अभिकलन किया गया है। add ऑप्स की एक श्रृंखला गणना के कुछ आरंभिक होने की अनुमति देता है।)

0

tf.nn.l2_loss() समारोह 0 आयामों के साथ एक टेन्सर देता है।

लेकिन प्रत्येक वजन टेंसर पर मैन्युअल रूप से इसे लागू करने की आवश्यकता नहीं है, इसलिए सूची में वजन टेंसर को संग्रहीत करना समस्या को हल करने का एक तरीका है (जैसा कि @mrry नोट किया गया है)।

बल्कि कि बाहर हर बार लिखने के लिए की आवश्यकता होगी, की तुलना में, आप क्या कर सकता है निम्नलिखित समारोह

def l2_loss_sum(list_o_tensors): 
    return tf.add_n([tf.nn.l2_loss(t) for t in list_o_tensors]) 

का उपयोग आपके मामले में ऐसा दिखाई देगा है:

total_loss = l2_loss_sum([layers[j].weights for j in range(self.n_layers)]) 

इसके अलावा, tf.nn.l2_loss() परोक्ष मानों के लिए स्क्वायरिंग ऑपरेशन को लागू करता है और साथ ही साथ सभी वर्गों को 1/2 तक गुणा करता है, तो क्या आप tf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers)) जैसे कुछ उपयोग करते थे, आप वास्तव में चौथी शक्ति के वजन को बढ़ाएंगे। नतीजतन इस हानि अवधि का आपका व्युत्पन्न अजीब होगा: यह 1/2 से 1 को रद्द नहीं करेगा (लेकिन निश्चित रूप से आपके β को दोगुना कर देगा) और वजन घट जाएगा।