使用tf.train.MonitoredTrainingSession
編寫檢查點文件時,它以某種方式寫入多個元圖。我究竟做錯了什麼?MonitoredTrainingSession每次運行寫入多個metagraph事件
我剝奪它歸結爲以下代碼:
import tensorflow as tf
global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name="global_step")
train = tf.assign(global_step, global_step + 1)
saver = tf.train.Saver()
hooks = [(tf.train.CheckpointSaverHook(checkpoint_dir=output_path + "test1/ckpt/",
save_steps = 10,
saver = saver))]
with tf.train.MonitoredTrainingSession(master = '',
is_chief = True,
checkpoint_dir = None,
hooks = hooks,
save_checkpoint_secs = None,
save_summaries_steps = None,
save_summaries_secs = None) as mon_sess:
for i in range(30):
if mon_sess.should_stop():
break
try:
gs, _ = mon_sess.run([global_step, train])
print(gs)
except (tf.errors.OutOfRangeError,tf.errors.CancelledError) as e:
break
finally:
pass
運行這會給重複metagraphs,就證明了這tensorboard警告:
$ tensorboard --logdir ../train/test1/ --port=6006
警告:tensorflow:有一個以上每次運行一個圖形事件,或者存在 是一個包含graph_def的metagraph,以及一個或多個事件圖。用最新的事件覆蓋圖形。在當地開始 TensorBoard 54:6006(按CTRL + C退出)
這是tensorflow 1.2.0(我不能升級)。
沒有監控會話中運行同樣的事情給出正確的檢查點輸出:
global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name="global_step")
train = tf.assign(global_step, global_step + 1)
saver = tf.train.Saver()
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
for i in range(30):
gs, _ = sess.run([global_step, train])
print(gs)
if i%10==0:
saver.save(sess, output_path+'/test2/my-model', global_step=gs)
print("Saved ckpt")
結果中沒有tensorboard錯誤:
$ tensorboard --logdir ../traitest2/ --port=6006
在當地開始TensorBoard 54:6006(按CTRL + C退出)
我想解決這個問題,因爲我懷疑我錯過了一些基本的東西,這個錯誤可能與我在分佈式模式下遇到的其他問題有一些聯繫。無論何時我想更新數據,我都必須重新啓動tensorboard。此外,隨着時間的推移,TensorBoard似乎變得非常緩慢,當它發出許多這些警告時。
有一個相關的問題:tensorflow Found more than one graph event per run 在這種情況下,錯誤是由於多次運行(使用不同的參數)寫入同一個輸出目錄。這裏的情況是關於一個簡單的運行到一個乾淨的輸出目錄。
在分佈式模式下運行MonitoredTrainingSession版本會產生相同的錯誤。
更新OCT-12
@Nikhil科塔裏建議使用tf.train.MonitoredSession
,而不是更大的tf.train.MonitoredTrainSession
包裝,具體如下:
import tensorflow as tf
global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name="global_step")
train = tf.assign(global_step, global_step + 1)
saver = tf.train.Saver()
hooks[(tf.train.CheckpointSaverHook(checkpoint_dir=output_path + "test3/ckpt/",
save_steps=10,
saver=saver))]
chiefsession = tf.train.ChiefSessionCreator(scaffold=None,
master='',
config=None,
checkpoint_dir=None,
checkpoint_filename_with_path=None)
with tf.train.MonitoredSession(session_creator=chiefsession,
hooks=hooks,
stop_grace_period_secs=120) as mon_sess:
for i in range(30):
if mon_sess.should_stop():
break
try:
gs, _ = mon_sess.run([global_step, train])
print(gs)
except (tf.errors.OutOfRangeError,tf.errors.CancelledError) as e:
break
finally:
pass
不幸的是,這仍然給出了同樣的錯誤tensorboard:
$ tensorboard --logdir ../train/test3/ --port=6006
警告:tensorflow:每次運行發現多個圖形事件,或者存在 是包含graph_def的元圖形,以及一個或多個圖形事件。用最新的事件覆蓋圖形。在當地開始 TensorBoard 54:6006(按CTRL + C退出)
順便說一句,每個代碼塊獨立,複製=粘貼在筆記本Jupyter,你會重現問題。
我確定您知道這一點,但以防萬一...... 如果您在創建「MonitoredTrainingSession」時指定'checkpoint_dir = your_path',它將正常工作。 – npf
感謝您的建議,我剛纔試了一下,在MonitoredSession和hook中添加了checkpoint_dir。雖然沒有區別。它「工作得很好」,還挺好,但仍然有多個圖形事件的問題。 – Bastiaan