2015-11-20 11 views
21

के दौरान हानि को प्रिंट करना मैं टेंसरफ्लो "एमएलआईएसटी फॉर एमएल शुरुआती" ट्यूटोरियल देख रहा हूं, और मैं प्रत्येक प्रशिक्षण चरण के बाद प्रशिक्षण हानि को मुद्रित करना चाहता हूं।टेंसरफ्लो प्रशिक्षण

मेरे प्रशिक्षण पाश वर्तमान में इस तरह दिखता है:

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 

कहाँ cross_entropy हानि जो मैं बाहर प्रिंट करना चाहते है:

cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

अब, train_step के रूप में परिभाषित किया गया है

इसे मुद्रित करने का एक तरीका स्पष्ट रूप सेकी गणना करना होगाप्रशिक्षण पाश में:

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 
    print 'loss = ' + str(cross_entropy) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

मैं अब इस बारे में दो प्रश्न हैं:

  1. यह देखते हुए कि cross_entropy पहले से ही sess.run(train_step, ...) दौरान गणना की जाती है, यह इसे दो बार गणना करने के लिए अक्षम लगता है, दो बार की संख्या की आवश्यकता होती है सभी प्रशिक्षण डेटा के आगे पास। cross_entropy के मान तक पहुंचने का कोई तरीका है जब इसे sess.run(train_step, ...) के दौरान गणना की गई थी?

  2. मैं tf.Variable कैसे प्रिंट करूं? str(cross_entropy) का उपयोग करके मुझे एक त्रुटि मिलती है ...

धन्यवाद!

उत्तर

32

आप पर तर्कों की सूची में जोड़कर cross_entropy का मान प्राप्त कर सकते हैं।

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 
    _, loss_val = sess.run([train_step, cross_entropy], 
          feed_dict={x: batch_xs, y_: batch_ys}) 
    print 'loss = ' + loss_val 

एक ही दृष्टिकोण एक चर के वर्तमान मूल्य मुद्रित करने के लिए इस्तेमाल किया जा सकता: उदाहरण के लिए, इस प्रकार अपने for -loop फिर से लिखा जा सकता है। मान लें, cross_entropy का मूल्य के अलावा, आप एक tf.VariableW बुलाया का मूल्य मुद्रित करने के लिए करना चाहता था, तो आप निम्न कर सकता है:

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 
    _, loss_val, W_val = sess.run([train_step, cross_entropy, W], 
            feed_dict={x: batch_xs, y_: batch_ys}) 
    print 'loss = %s' % loss_val 
    print 'W = %s' % W_val 
+3

धन्यवाद। तो हर बार जब मैं 'sess.run ([train_step, cross_entropy]) कहता हूं, 'यह अभी भी केवल' cross_entropy' की गणना करता है, है ना? यह मेरे द्वारा पारित प्रत्येक चर के लिए अतिरिक्त अग्रेषित पास नहीं करता है? – Karnivaurus

+2

यह सही है - यह सटीक उसी सबग्राफ को निष्पादित करता है (क्योंकि 'cross_entropy' पहले से ही प्रशिक्षण चरण के हिस्से के रूप में गणना की जाती है), और आपके पाइथन प्रोग्राम पर 'cross_entropy' के मान को लाने के लिए बस एक अतिरिक्त नोड जोड़ता है। – mrry

+0

धन्यवाद।एक साइड प्वाइंट के रूप में, जैसा कि आपने सुझाव दिया है, मेरे कोड को अपडेट करने के बाद, 'cross_entropy' का मान, औसतन, लूप पर घटता है। हालांकि, कभी-कभी यह वास्तव में एक प्रशिक्षण पुनरावृत्ति से अगले तक बढ़ता है। यह ढाल वंश में कई चरणों के आकार के लिए होता है। क्या यह उम्मीद है? प्रत्येक पुनरावृत्ति के बाद नुकसान हमेशा कम नहीं होगा, क्योंकि आप वजन को एक दिशा में ले जा रहे हैं जिससे इस नुकसान को कम किया जा सके? हानि बनाम पुनरावृत्ति का ग्राफ यहां है: http://i.stack.imgur.com/f8B80.png – Karnivaurus

3

केवल प्रशिक्षण_स्टेप चलाने के बजाए, cross_entropy नोड भी चलाएं ताकि उसका मूल्य आपको वापस कर दिया जा सके। याद रखें कि:

var_as_a_python_value = sess.run(tensorflow_variable) 

आप दे देंगे आप क्या चाहते हैं, तो आप ऐसा कर सकते हैं: दोनों प्रशिक्षण चलाने के लिए

[_, cross_entropy_py] = sess.run([train_step, cross_entropy], 
           feed_dict={x: batch_xs, y_: batch_ys}) 

और पार एन्ट्रापी का मूल्य बाहर खींच के रूप में यह के दौरान गणना की गई थी यात्रा। ध्यान दें कि मैंने दोनों तर्कों को sess.run और वापसी मानों को एक सूची में बदल दिया है ताकि दोनों हो।

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