2016-10-20 22 views
16

Tôi có mô hình TensorFlow và một phần của mô hình này đánh giá độ chính xác. accuracy chỉ là một nút khác trong biểu đồ tensorflow, mất logitslabels.Hiển thị độ chính xác về đào tạo và xác nhận trong TensorFlow sử dụng cùng một biểu đồ

Khi tôi muốn âm mưu chính xác đào tạo, điều này rất đơn giản: Tôi có một cái gì đó như:

tf.scalar_summary("Training Accuracy", accuracy) 
tf.scalar_summary("SomethingElse", foo) 
summary_op = tf.merge_all_summaries() 
writer = tf.train.SummaryWriter('/me/mydir/', graph=sess.graph) 

Sau đó, trong vòng đào tạo của tôi, tôi có một cái gì đó như:

for n in xrange(1000): 
    ... 
    summary, ..., ... = sess.run([summary_op, ..., ...], feed_dict) 
    writer.add_summary(summary, n) 
    ... 

Ngoài ra bên trong đối với vòng lặp, cứ mỗi 100 lần lặp lại, tôi muốn đánh giá độ chính xác xác nhận. Tôi có một feed_dict riêng biệt cho điều này, và tôi có thể đánh giá độ chính xác xác nhận rất độc đáo trong python.

Tuy nhiên, đây là vấn đề của tôi: Tôi muốn thực hiện một bản tóm tắt khác cho độ chính xác xác thực, bằng cách sử dụng nút accuracy. Tôi không rõ ràng về cách làm điều này mặc dù. Vì tôi có nút accuracy, nên tôi có thể sử dụng lại nó, nhưng tôi không chắc chắn làm thế nào để làm điều này một cách chính xác, như vậy tôi cũng có thể nhận được độ chính xác xác nhận được viết dưới dạng scalar_summary riêng biệt ...

Làm thế nào điều này có thể thực hiện được?

+0

Đối với một số giải pháp khác, tôi có một câu hỏi tương tự [ở đây] (http://stackoverflow.com/questions/37146614/tensorboard-plot-training-and-validation-losses-on-the-same-graph). – golmschenk

+0

Điều này có thể trả lời các câu hỏi của bạn (không cần thiết lập hai thư mục tóm tắt): http://stackoverflow.com/questions/34471563/logging-training-and-validation-loss-in-tensorboard –

Trả lời

22

Bạn có thể sử dụng lại nút chính xác nhưng bạn cần phải sử dụng hai Trình viết tóm tắt khác nhau, một cho chạy đào tạo và một cho dữ liệu thử nghiệm. Ngoài ra, bạn phải gán bản tóm tắt vô hướng cho độ chính xác cho một biến.

accuracy_summary = tf.scalar_summary("Training Accuracy", accuracy) 
tf.scalar_summary("SomethingElse", foo) 
summary_op = tf.merge_all_summaries() 
summaries_dir = '/me/mydir/' 
train_writer = tf.train.SummaryWriter(summaries_dir + '/train', sess.graph) 
test_writer = tf.train.SummaryWriter(summaries_dir + '/test') 

Sau đó, trong vòng đào tạo, bạn có đào tạo bình thường và ghi tóm tắt của bạn với train_writer. Ngoài ra, bạn chạy biểu đồ trên thử nghiệm đặt mỗi lần lặp thứ 100 và chỉ ghi lại tóm tắt chính xác với test_writer.

# Record train set summaries, and train 
summary, _ = sess.run([summary_op, train_step], feed_dict=...) 
train_writer.add_summary(summary, n) 
if n % 100 == 0: # Record summaries and test-set accuracy 
    summary, acc = sess.run([accuracy_summary, accuracy], feed_dict=...) 
    test_writer.add_summary(summary, n) 
    print('Accuracy at step %s: %s' % (n, acc)) 

Sau đó bạn có thể trỏ TensorBoard vào thư mục mẹ (summaries_dir) và nó sẽ tải cả hai tập dữ liệu.

này cũng có thể được tìm thấy trong TensorFlow Howto của https://www.tensorflow.org/versions/r0.11/how_tos/summaries_and_tensorboard/index.html

+0

Cảm ơn bạn đã để tôi dùng thử ... sẽ báo cáo lại. – Spacey

+0

Ok vì vậy tôi nghĩ rằng đây là vấn đề: "summary_op" chứa các tóm tắt hợp nhất của một số thứ. Tuy nhiên tôi chỉ muốn "tóm tắt" cho validation_error ... điều đó có hợp lý không? Giống như nếu tôi vượt qua trong "summary_op" một lần nữa bên trong vòng lặp n% 100 và nhận được "tóm tắt" ra, sau đó nó có vẻ như nó sẽ "chạy" TẤT CẢ các bản tóm tắt. (Tất cả những cái đã được sáp nhập).Nhưng tôi chỉ muốn nút chính xác được chạy ... – Spacey

+0

Ngoài ra, tại sao không test_writer có một "sess.graph" trong nó? – Spacey

4

Để chạy các hoạt động tương tự nhưng được tóm tắt với các dữ liệu feed_dict khác nhau, chỉ cần đính kèm hai ops tóm tắt để op đó. Giả sử bạn muốn chạy chính xác op trên cả dữ liệu xác nhận và thử nghiệm và muốn nhận được bản tóm tắt cho cả hai:

validation_acc_summary = tf.summary.scalar('validation_accuracy', accuracy) # intended to run on validation set 
test_acc_summary = tf.summary.scalar('test_accuracy', accuracy) # intended to run on test set 
with tf.Session() as sess: 
    # do your thing 
    # ... 
    # accuracy op just needs labels y_ and input x to compute logits 
    validation_summary_str = sess.run(validation_acc_summary, feed_dict=feed_dict={x: mnist.validation.images,y_: mnist.validation.labels}) 
    test_summary_str = sess.run(test_acc_summary, feed_dict={x: mnist.test.images,y_: mnist.test.labels}) 

    # assuming you have a tf.summary.FileWriter setup 
    file_writer.add_summary(validation_summary_str) 
    file_writer.add_summary(test_summary_str) 

Cũng nên nhớ bạn luôn có thể kéo thô (vô hướng) dữ liệu ra khỏi summary_str protobuff như this và làm của riêng bạn ghi nhật ký.

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