2017-08-25 67 views
0

我試圖在ML引擎實驗中在列車和eval時間輸出一些彙總標量。 tf.summary.scalar('loss', loss)正確地輸出了張量板上相同圖形上的訓練和評估的總體標量。但是,我也試圖在列車和eval時間輸出其他指標,並且它們僅在列車時間輸出。代碼緊接在tf.summary.scalar('loss', loss)之後,但似乎不起作用。例如,以下代碼僅對TRAIN輸出,而不是EVAL。唯一的區別是,這些使用自定義的準確性功能,但它們正在爲列車ML引擎實驗eval tf.summary.scalar在張量板中不顯示

if mode in (Modes.TRAIN, Modes.EVAL): 
    loss = tf.contrib.legacy_seq2seq.sequence_loss(logits, outputs, weights) 
    tf.summary.scalar('loss', loss) 

    sequence_accuracy = sequence_accuracy(targets, predictions,weights) 
    tf.summary.scalar('sequence_accuracy', sequence_accuracy) 

這會讓爲什麼損失將在tensorboard繪製兩個TRAIN & EVAL,而sequence_accuracy只畫出火車什麼意義?

這種行爲是否與我收到的警告有關「每次運行發現多個metagraph事件,用最新事件覆蓋metagraph」?

回答

1

因爲圖中的summary節點只是一個節點。它仍然需要評估(輸出protobuf字符串),並且該字符串仍然需要寫入文件。它不在訓練模式下評估,因爲它不在圖表中的train_op的上游,即使評估過,也不會將其寫入文件,除非您在EstimatorSpec中將tf.train.SummarySaverHook指定爲training_chief_hooks之一。由於Estimator班級並未假設您需要在培訓期間進行額外評估,因此通常只會在EVAL階段進行評估,您只需增加min_eval_frequencycheckpoint_frequency即可獲得更多評估數據點。

如果你真的想訓練期間記錄的彙總這裏是你會怎麼做:

def model_fn(mode, features, labels, params): 
    ... 
    if mode == Modes.TRAIN: 
    # loss is already written out during training, don't duplicate the summary op 
    loss = tf.contrib.legacy_seq2seq.sequence_loss(logits, outputs, weights) 
    sequence_accuracy = sequence_accuracy(targets, predictions,weights) 
    seq_sum_op = tf.summary.scalar('sequence_accuracy', sequence_accuracy) 
    with tf.control_depencencies([seq_sum_op]): 
     train_op = optimizer.minimize(loss) 

    return tf.estimator.EstimatorSpec(
     loss=loss, 
     mode=mode, 
     train_op=train_op, 
     training_chief_hooks=[tf.train.SummarySaverHook(
      save_steps=100, 
      output_dir='./summaries', 
      summary_op=seq_sum_op 
    )] 
    ) 

但它是更好的只是增加你的eval頻率,併爲準確的eval_metric_opstf.metrics.streaming_accuracy

+0

我有點困惑,因爲你說「它沒有在訓練模式下評估」,但是我面臨的問題是它是輸出訓練,它不是輸出的評估模式 - 這是一個錯字還是我通過查看培訓指標已經觀察到意想不到的行爲顯示在張量板上? – reese0106

+0

另外,我想在eval_metric_ops之外做這件事的原因是我想要有一個單獨的圖表,顯示了在評估期間訓練時間和準確性期間的準確性,作爲潛在過度擬合的另一個標準,或者表明預測正在產生的一些跡象不同。例如,如果我正在用feed_previous = False訓練RNN,並且用feed_previous = True進行評估,我想了解訓練過程中feed_previous = False的準確性,並與feed_previous = True的eval進行比較。 – reese0106

+0

我有點困惑,Estimator已經覆蓋了培訓和eval統計。 –