Kiedy piszemy pliki punktów kontrolnych za pomocą tf.train.MonitoredTrainingSession
, to w jakiś sposób zapisuje wiele metepikseli. Co ja robię źle?MonitoredTrainingSession zapisuje więcej niż jedno zdarzenie metagraph na jeden bieg
rozebrałem ją do następującego kodu:
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
Running to da duplikaty metagraphs, o czym świadczy ostrzeżenia tensorboard:
$ tensorboard --logdir ../train/test1/ --port=6006
Ostrzeżenie: tensorflow: Znaleziono ponad jedno graficzne zdarzenie na bieg, lub tam było meteptukiem zawierającym graph_def, a także jednym lub większą liczbą zdarzeń z wykresu . Zastępowanie wykresu najnowszym wydarzeniem. Począwszy TensorBoard 54 w lokalu: 6006 (Ctrl + C, aby zamknąć)
To jest w tensorflow 1.2.0 (nie mogę uaktualnić).
bieganie to samo bez monitorowanej sesji daje prawo wyjścia kontrolnego:
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")
Skutkuje bez błędów tensorboard:
$ tensorboard --logdir ../traitest2/ --port=6006
Zaczynając TensorBoard 54 w lokalu: 6006 (Ctrl + C, aby zakończyć)
Chciałbym to naprawić, jak podejrzewam Brakuje mi czegoś fundamentalnego, a ten błąd może mieć związek z innymi problemami, które mam w trybie rozproszonym. Muszę ponownie uruchomić tensorboard, gdy tylko chcę zaktualizować dane. Co więcej, wydaje się, że TensorBoard staje się naprawdę wolny z czasem, gdy wypuszcza wiele z tych ostrzeżeń.
Istnieje pokrewne pytanie: tensorflow Found more than one graph event per run W tym przypadku błędy były spowodowane wielokrotnymi uruchomieniami (z różnymi parametrami) zapisanymi w tym samym katalogu wyjściowym. Przypadek tutaj dotyczy pojedynczego uruchomienia do czystego katalogu wyjściowego.
Uruchomienie wersji MonitoredTrainingSession w trybie rozproszonym daje takie same błędy.
Aktualizacja października-12
@Nikhil Kothari zalecane, aby użyć tf.train.MonitoredSession
zamiast większej tf.train.MonitoredTrainSession
owijki, co następuje:
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
Niestety to wciąż daje te same błędy tensorboard:
$ tensorboard --logdir ../train/test3/ --port=6006
OSTRZEŻENIE: tensorflow: Znalezione więcej niż jedno zdarzenie grafu na przebieg, lub tam było meteptukiem zawierającym wykres_def, a także jednym lub wieloma zdarzeniami z wykresu . Zastępowanie wykresu najnowszym wydarzeniem.Począwszy TensorBoard 54 w lokalu: 6006 (Ctrl + C, aby zamknąć)
btw, każdy blok kodu jest stand-alone, kopiowanie = wkleić go w notatniku Jupyter i będzie replikować problemu.
Jestem pewien, że zdajesz sobie sprawę z tego, ale na wszelki wypadek ... Jeśli podasz 'checkpoint_dir = your_path' podczas tworzenia' MonitoredTrainingSession' będzie po prostu działać. – npf
Dzięki za sugestię, próbowałem już teraz, aby dodać punkt kontrolny w obu MonitoredSession i hak. Jednak nie ma różnicy. To "działa dobrze", w porządku, ... nadal ma problem z wieloma zdarzeniami graficznymi. – Bastiaan