2015-11-20 22 views
21

Tôi đang xem hướng dẫn "MNIST For ML Beginners" của TensorFlow, và tôi muốn in ra tổn thất đào tạo sau mỗi bước đào tạo.In ấn sự mất mát trong quá trình đào tạo TensorFlow

vòng đào tạo của tôi hiện trông như thế nà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}) 

Bây giờ, train_step được định nghĩa là:

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

đâu cross_entropy là sự mất mát mà tôi muốn in ra:

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

Một cách để in này sẽ được tính toán một cách rõ ràng cross_entropy trong vòng lặp đào tạo:

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}) 

bây giờ tôi có hai câu hỏi về vấn đề này:

  1. Cho rằng cross_entropy đã được tính toán trong sess.run(train_step, ...), có vẻ như không hiệu quả để tính toán nó hai lần, đòi hỏi phải gấp đôi số chuyển tiếp của tất cả các dữ liệu đào tạo. Có cách nào để truy cập vào giá trị của cross_entropy khi được tính trong thời gian sess.run(train_step, ...) không?

  2. Tôi làm cách nào để in tf.Variable? Sử dụng str(cross_entropy) cho tôi một lỗi ...

Cảm ơn bạn!

Trả lời

32

Bạn có thể tìm nạp giá trị cross_entropy bằng cách thêm nó vào danh sách đối số cho sess.run(...). Ví dụ: số for của bạn có thể được viết lại như sau:

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 

Phương pháp tương tự có thể được sử dụng để in giá trị hiện tại của biến. Hãy nói rằng, ngoài giá trị của cross_entropy, bạn muốn in giá trị của một tf.Variable gọi W, bạn có thể làm như sau:

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

Cảm ơn. Vì vậy, mỗi khi tôi gọi 'sess.run ([train_step, cross_entropy])', nó vẫn chỉ tính toán 'cross_entropy' một lần, đúng không? Nó không làm thêm một chuyển tiếp cho mỗi biến tôi vượt qua? – Karnivaurus

+2

Đúng vậy - nó thực hiện cùng một biểu đồ con chính xác (vì 'cross_entropy' đã được tính như là một phần của bước huấn luyện), và chỉ thêm một nút phụ để lấy giá trị của' cross_entropy' trở lại chương trình Python của bạn. – mrry

+0

Cảm ơn.Là một điểm phụ, sau khi cập nhật mã của tôi như bạn đã đề xuất, giá trị của 'cross_entropy', tính trung bình, giảm trên vòng lặp. Tuy nhiên, đôi khi nó thực sự tăng từ một lần đào tạo đến lần tiếp theo. Điều này xảy ra cho một loạt các kích thước bước trong độ dốc. Đây có phải là dự kiến ​​không? Sẽ không phải mất luôn luôn giảm sau mỗi lần lặp lại, bởi vì bạn đang di chuyển các trọng số theo một hướng mà nên giảm tổn thất này? Biểu đồ của sự mất mát và lặp lại là ở đây: http://i.stack.imgur.com/f8B80.png – Karnivaurus

3

Thay vì chỉ chạy training_step, hãy chạy nút cross_entropy để giá trị của nó được trả lại cho bạn. Hãy nhớ rằng:

var_as_a_python_value = sess.run(tensorflow_variable) 

sẽ cung cấp cho bạn những gì bạn muốn, vì vậy bạn có thể làm điều này:

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

cho cả hai chạy công tác đào tạo và kéo ra giá trị của entropy chéo như nó đã được tính trong suốt lặp lại. Lưu ý rằng tôi đã chuyển cả hai đối số thành sess.run và các giá trị trả về thành một danh sách để cả hai đều xảy ra.

Các vấn đề liên quan