2016-09-09 3 views
0

のは、私はこのようなシナリオがあるとしましょう:TensorFlowで複数のグラフ呼び出しに対して平均化されたスカラサマリを作成するにはどうすればよいですか?

import tensorflow as tf 

sess = tf.Session() 

x = tf.random_normal([]) 
tf.scalar_summary('x', x) 

merged = tf.merge_all_summaries() 
sw = tf.train.SummaryWriter('.', sess.graph) 

summaries = [] 
for i in range(100): 
    summary = sess.run(merged) 
    sw.add_summary(summary, i/10) 
    summaries.append(summary) 

sw.close() 

私は同じglobal_stepを平均化する必要がある10の値を求めています。以前の値を入力してグラフの中に追加する方法とは別に、これを達成する方法はありますか?おそらく、summariesバイナリプロトコルバッファメッセージの配列を使用して、おそらくgoogle.protobufを使用して、その場でスカラーサマリーを作成することはできますか?

+0

たぶんストリーミングメトリックは仕事をすることができます。https://www.tensorflow.org/versions/master/api_guides/python/contrib.metrics – Maikefer

答えて

1

x値の平均値を追跡する変数をグラフに追加できます。

以下の変更例を参照してください。

このコードは、count変数とrunning_sum変数を追加します。サマリーオペレーションは、running_sum/countオペレーションに接続されます。 と同じセッションのグラフを評価すると、running_sumおよびcount変数の状態が維持されます。

g = tf.Graph() 
with g.as_default(): 
    tf.set_random_seed(1234) 

    x = tf.random_normal([]) 

    count = tf.get_variable("count", initializer=tf.zeros([]), dtype=tf.float32) 
    count = count.assign_add(1) 

    running_sum = tf.get_variable("running_sum", initializer=tf.zeros_like(x)) 
    running_sum = running_sum.assign_add(x) 
    avg = tf.div(running_sum, count) 
    tf.scalar_summary("average", avg) 

    merged = tf.merge_all_summaries() 
    sw = tf.train.SummaryWriter('.', sess.graph) 
    init_op = tf.initialize_all_variables() 

with tf.Session(graph=g) as sess: 
    sess.run(init_op) 
    x_values = [] 
    for i in range(10): 
     value, x_value, summaries_value = sess.run([avg, x, merged]) 
     # Accumulate the values 
     x_values.append(x_value) 
     # Test it 
     np_mean = np.mean(x_values) 
     np.testing.assert_almost_equal(np_mean, value) 
     print value, x_value  

出力:

0.325545 0.325545 
0.201057 -0.124489 
-0.468691 -0.669747 
-0.729087 -0.260396 
-0.323435 0.405652 
0.263484 0.586919 
0.600163 0.336679 
-0.763652 -1.36382 
-0.369373 0.394279 
-0.934823 -0.56545 
関連する問題