2016-11-22 3 views
2

私はトレーニング手順を視覚化するためにTensorboardを使用しようとしています。私の目的は、すべてのエポックが完成したら、検証データセット全体を使ってネットワークの精度をテストし、この精度結果をサマリーファイルに保存してTensorboardで視覚化できるようにすることです。Tensorflowで列車/試験データセット全体の精度の要約を追加してください

私はTensorflowにはsummary_opがあることを知っていますが、コードsess.run(summary_op)を実行すると1つのバッチでしか動作しないようです。私は全体のデータセットの精度を計算する必要があります。どうやって?

どのような例がありますか?

答えて

4

プレースホルダを受け入れるtf.scalar_summaryを定義:

accuracy_value_ = tf.placeholder(tf.float32, shape=()) 
accuracy_summary = tf.scalar_summary('accuracy', accuracy_value_) 

そして全データセットの精度を計算する(データセット内のすべてのバッチの精度を算出ルーチンを定義し、平均値を抽出)して保存Python変数に、vaと呼ぶことにしましょう。

あなただけaccuracy_value_プレースホルダを供給し、accuracy_summaryオペを実行し、vaの値を取得したら:

sess.run(accuracy_summary, feed_dict={accuracy_value_: va}) 
1

私はMNISTデータセットを分類し、内での検証精度を視覚化する例として、ナイーブ1層モデルを実装テンソルボード、それは私のために働く。

import tensorflow as tf 
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets 
import os 

# number of epoch 
num_epoch = 1000 
model_dir = '/tmp/tf/onelayer_model/accu_info' 
# mnist dataset location, change if you need 
data_dir = '../data/mnist' 

# load MNIST dataset without one hot 
dataset = read_data_sets(data_dir, one_hot=False) 

# Create placeholder for input images X and labels y 
X = tf.placeholder(tf.float32, [None, 784]) 
# one_hot = False 
y = tf.placeholder(tf.int32) 

# One layer model graph 
W = tf.Variable(tf.truncated_normal([784, 10], stddev=0.1)) 
b = tf.Variable(tf.constant(0.1, shape=[10])) 
logits = tf.nn.relu(tf.matmul(X, W) + b) 

init = tf.initialize_all_variables() 

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, y) 
# loss function 
loss = tf.reduce_mean(cross_entropy) 
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

_, top_1_op = tf.nn.top_k(logits) 
top_1 = tf.reshape(top_1_op, shape=[-1]) 
correct_classification = tf.cast(tf.equal(top_1, y), tf.float32) 
# accuracy function 
acc = tf.reduce_mean(correct_classification) 

# define info that is used in SummaryWritter 
acc_summary = tf.scalar_summary('valid_accuracy', acc) 
valid_summary_op = tf.merge_summary([acc_summary]) 

with tf.Session() as sess: 
    # initialize all the variable 
    sess.run(init) 

    print("Writing Summaries to %s" % model_dir) 
    train_summary_writer = tf.train.SummaryWriter(model_dir, sess.graph) 

    # load validation dataset 
    valid_x = dataset.validation.images 
    valid_y = dataset.validation.labels 

    for epoch in xrange(num_epoch): 
     batch_x, batch_y = dataset.train.next_batch(100) 
     feed_dict = {X: batch_x, y: batch_y} 
     _, acc_value, loss_value = sess.run(
      [train_op, acc, loss], feed_dict=feed_dict) 
     vsummary = sess.run(valid_summary_op, 
          feed_dict={X: valid_x, 
             y: valid_y}) 

     # Write validation accuracy summary 
     train_summary_writer.add_summary(vsummary, epoch) 
+0

したがって、検証データセットをメモリにあらかじめロードする必要がありますか? –

+0

エポックの精度を評価したい場合は絶対にはいです。 – daoliker

+0

キューを使用することは可能ですか? –

0

内部カウンタを使用するtf.metrics opsを使用している場合は、検証セットでバッチングを使用できます。有効なライターを使用して、両方の要約を書き、すべての検証後

summary = sess.run(summary_common) 
train_writer.add_summary(summary, tf.train.global_step(sess, gstep_op)) 
train_writer.flush() 

model = create_model() 
tf.summary.scalar('cost', model.cost_op) 
acc_value_op, acc_update_op = tf.metrics.accuracy(labels,predictions) 

summary_common = tf.summary.merge_all() 

summary_valid = tf.summary.merge([ 
    tf.summary.scalar('accuracy', acc_value_op), 
    # other metrics here... 
]) 

with tf.Session() as sess: 
    train_writer = tf.summary.FileWriter(logs_path + '/train', 
             sess.graph) 
    valid_writer = tf.summary.FileWriter(logs_path + '/valid') 

トレーニングながら、あなただけの列車ライターを使用して、一般的な概要を記述します。ここでは単純化した例があります:

gstep, summaryc, summaryv = sess.run([gstep_op, summary_common, summary_valid]) 
valid_writer.add_summary(summaryc, gstep) 
valid_writer.add_summary(summaryv, gstep) 
valid_writer.flush() 

tf.metricsを使用する場合、内部クーをリセットすることを忘れないでくださいすべての検証ステップの前にnters(ローカル変数)。

関連する問題