2015-12-26 23 views
23

Tôi đang cố gắng tìm hiểu cách sử dụng tensorflow và tensorboard. Tôi có một dự án thử nghiệm dựa trên hướng dẫn mạng neural MNIST (https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html).Việc đào tạo ghi nhật ký và mất xác thực trong bảng dẫn

Trong mã của tôi, tôi xây dựng một nút để tính toán phần của chữ số trong một tập dữ liệu được phân loại một cách chính xác, như thế này:

correct = tf.nn.in_top_k(self._logits, labels, 1) 
correct = tf.to_float(correct) 
accuracy = tf.reduce_mean(correct) 

Ở đây, self._logits là phần kết luận của đồ thị, và labels là một trình giữ chỗ chứa các nhãn chính xác.

Bây giờ, những gì tôi muốn làm là đánh giá độ chính xác cho cả tập huấn luyện và bộ xác thực là tiền thu được đào tạo. Tôi có thể thực hiện việc này bằng cách chạy nút chính xác hai lần, với các feed_dicts khác nhau:

train_acc = tf.run(accuracy, feed_dict={images : training_set.images, labels : training_set.labels}) 
valid_acc = tf.run(accuracy, feed_dict={images : validation_set.images, labels : validation_set.labels}) 

Điều này hoạt động như dự định. Tôi có thể in các giá trị, và tôi có thể thấy rằng ban đầu, hai độ chính xác sẽ tăng lên, và cuối cùng độ chính xác xác nhận sẽ làm phẳng ra trong khi độ chính xác đào tạo tiếp tục tăng lên.

Tuy nhiên, tôi cũng muốn lấy đồ thị của các giá trị này trong bảng mạch vành và tôi không thể tìm ra cách thực hiện điều này. Nếu tôi chỉ cần thêm scalar_summary vào accuracy, các giá trị được ghi sẽ không phân biệt giữa tập hợp đào tạo và tập hợp xác thực.

Tôi cũng đã thử tạo hai nút giống hệt nhau accuracy với các tên khác nhau và chạy một trên bộ đào tạo và một trên bộ xác thực. Sau đó tôi thêm một scalar_summary vào mỗi nút này. Điều này cho tôi hai đồ thị trong tensorboard, nhưng thay vì một đồ thị hiển thị độ chính xác của tập huấn luyện và một biểu thị độ chính xác được xác nhận, chúng đều hiển thị các giá trị giống hệt nhau không khớp với giá trị được in tới thiết bị đầu cuối.

Tôi có thể hiểu lầm cách giải quyết vấn đề này. Cách được khuyến nghị ghi riêng đầu ra từ một nút đơn cho các đầu vào khác nhau là gì?

Trả lời

39

Có một số cách khác nhau bạn có thể đạt được điều này, nhưng bạn đang đi đúng hướng với việc tạo các nút khác nhau tf.summary.scalar(). Vì bạn phải gọi một cách rõ ràng SummaryWriter.add_summary() mỗi lần bạn muốn đăng nhập một số lượng đến tập tin sự kiện, cách tiếp cận đơn giản nhất có lẽ là để lấy nút tóm tắt thích hợp mỗi khi bạn muốn để có được đào tạo hoặc xác nhận chính xác:

accuracy = tf.reduce_mean(correct) 

training_summary = tf.summary.scalar("training_accuracy", accuracy) 
validation_summary = tf.summary.scalar("validation_accuracy", accuracy) 


summary_writer = tf.summary.FileWriter(...) 

for step in xrange(NUM_STEPS): 

    # Perform a training step.... 

    if step % LOG_PERIOD == 0: 

    # To log training accuracy. 
    train_acc, train_summ = sess.run(
     [accuracy, training_summary], 
     feed_dict={images : training_set.images, labels : training_set.labels}) 
    writer.add_summary(train_summ, step) 

    # To log validation accuracy. 
    valid_acc, valid_summ = sess.run(
     [accuracy, validation_summary], 
     feed_dict={images : validation_set.images, labels : validation_set.labels}) 
    writer.add_summary(valid_summ, step) 

Ngoài , bạn có thể tạo một bản tóm tắt duy nhất có thẻ là tf.placeholder(tf.string, []) và cấp chuỗi "training_accuracy" hoặc "validation_accuracy" nếu thích hợp.

+4

Cảm ơn! Đây chính xác là những gì tôi đang tìm kiếm! Vấn đề của tôi là tôi đã cố gắng sử dụng một cuộc gọi duy nhất để 'merge_all_summaries' thay vì làm' add_summary' cho mỗi bản tóm tắt. Tài liệu này dường như gợi ý rằng việc sử dụng 'merge_all_summaries' được ưu tiên hơn các lệnh gọi riêng lẻ đến' add_summary', nhưng trong trường hợp này, cách thủ công có vẻ tốt hơn. – user3468216

+4

Đó là chính xác: 'merge_all_summaries' là một" một kích thước phù hợp với tất cả "cách để làm việc, nhưng các cuộc gọi cá nhân để' add_summary' cung cấp cho bạn kiểm soát nhiều hơn nữa. (Đối với những gì nó có giá trị, chúng tôi thường thiết lập các quy trình riêng biệt để thực hiện đào tạo và xác nhận, trong đó nhiệm vụ xác nhận có riêng - hơi khác - biểu đồ và tải trong trạm kiểm tra mô hình mới nhất định kỳ.) – mrry

+0

@mrry Có hướng dẫn về cách chạy xác nhận trong khi đề cập đến các trạm kiểm soát đào tạo? – piRSquared

1

Một cách khác để làm điều đó, là sử dụng một người viết tệp thứ hai. Vì vậy, bạn có thể sử dụng lệnh merge_summaries.

train_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/train', sess.graph) test_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/test') tf.global_variables_initializer().run()

Đây là tài liệu hoàn chỉnh. Điều này phù hợp với tôi: https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard

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