Резюме Тренировка tf.keras Тензорборд - PullRequest
2 голосов
/ 06 марта 2019

Я столкнулся с некоторыми проблемами, когда продолжил тренировать свою модель и визуализировал прогресс на тензорной доске.

Tensorboard Training Visualization

Мой вопрос заключается в том, как возобновить обучение стот же шаг без указания какой-либо эпохи вручную?Если возможно, просто загрузив сохраненную модель, она каким-то образом может прочитать global_step из сохраненного оптимизатора и продолжить оттуда обучение.

Я предоставил несколько кодов ниже, чтобы воспроизвести подобные ошибки.

import tensorflow as tf
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.models import load_model

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10, callbacks=[Tensorboard()])
model.save('./final_model.h5', include_optimizer=True)

del model

model = load_model('./final_model.h5')
model.fit(x_train, y_train, epochs=10, callbacks=[Tensorboard()])

Вы можете запустить tensorboard с помощью команды:

tensorboard --logdir ./logs

Ответы [ 3 ]

3 голосов
/ 06 марта 2019

Вы можете установить параметр initial_epoch в функции model.fit() на номер эпохи, с которой вы хотите начать обучение.Учтите, что модель обучается до достижения эпохи индекса epochs (а не числа итераций, заданных epochs).В вашем примере, если вы хотите тренироваться еще на 10 эпох, это должно быть:

model.fit(x_train, y_train, initial_epoch=9, epochs=19, callbacks=[Tensorboard()])

Это позволит вам правильно визуализировать ваши графики на Tensorboard.Более подробную информацию об этих параметрах можно найти в документах .

1 голос
/ 18 марта 2019

Вот пример кода на тот случай, если он кому-то нужен. Он реализует идею, предложенную Абхинавом Анандом:

mca = ModelCheckpoint(join(dir, 'model_{epoch:03d}.h5'),
                      monitor = 'loss',
                      save_best_only = False)
tb = TensorBoard(log_dir = join(dir, 'logs'),
                 write_graph = True,
                 write_images = True)
files = sorted(glob(join(fold_dir, 'model_???.h5')))
if files:
    model_file = files[-1]
    initial_epoch = int(model_file[-6:-3])
    print('Resuming using saved model %s.' % model_file)
    model = load_model(model_file)
else:
    model = nn.model()
    initial_epoch = 0
model.fit(x_train,
          y_train,
          epochs = 100,
          initial_epoch = initial_epoch,
          callbacks = [mca, tb])

Замените nn.model() собственной функцией определения модели.

1 голос
/ 07 марта 2019

Это очень просто. Создайте контрольные точки во время обучения модели, а затем используйте эти контрольные точки для возобновления обучения с того места, где вы оставили.

import tensorflow as tf
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.models import load_model

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation=tf.nn.relu),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10, callbacks=[Tensorboard()])
model.save('./final_model.h5', include_optimizer=True)

model = load_model('./final_model.h5')

callbacks = list()

tensorboard = Tensorboard()
callbacks.append(tensorboard)

file_path = "model-{epoch:02d}-{loss:.4f}.hdf5"

# now here you can create checkpoints and save according to your need
# here period is the no of epochs after which to save the model every time during training
# another option is save_weights_only, for your case it should be false
checkpoints = ModelCheckpoint(file_path, monitor='loss', verbose=1, period=1, save_weights_only=False)
callbacks.append(checkpoints)

model.fit(x_train, y_train, epochs=10, callbacks=callbacks)

После этого просто загрузите контрольную точку, с которой вы хотите возобновить обучение снова

model = load_model(checkpoint_of_choice)
model.fit(x_train, y_train, epochs=10, callbacks=callbacks)

И все готово.

Дайте мне знать, если у вас есть еще вопросы по этому поводу.

...