Сохранение состояния оптимизатора с использованием сохраненного формата Tensorflow .pb

#tensorflow #deep-learning #tensorflow2.0 #tf.keras

#tensorflow #глубокое обучение #tensorflow2.0 #tf.keras

Вопрос:

Я заметил, что состояния оптимизатора не сохраняются для .pb сохраненных моделей, созданных с помощью функции Tensorflow model.save(filepath) .

При загрузке данной .pb модели ее оптимизатор перезапускается с самого начала (количество итераций сбрасывается до нуля).

Одним из решений для решения этой проблемы было бы использование .h5 формата. Я сохранил модель с функцией, model.save(filepath) где filepath указан путь к новому файлу h5, и кажется, что состояние оптимизатора хорошо сохранено.

Однако мне интересно, возможно ли сохранить состояние оптимизатора в .pb формате, поскольку я планирую использовать обслуживание Tensorflow.

Вот мой код :

У меня есть callback.py файл, содержащий обратный вызов, который используется для печати количества итераций оптимизатора :

 class CustomCallback(tf.keras.callbacks.Callback):
   def on_epoch_end(self, epoch, logs=None):
       print("Number of iterations : " , self.model.optimizer.iterations.numpy())
  

Я сохранил модель (которая на самом деле является папкой, содержащей .pb модель) с :

 model = keras.Sequential()
model.add(...)
model.add(...)
...

model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(x_train, y_train, epochs=3, batch_size=50, callbacks=[CustomCallback()])
model.save("saved_model", overwrite=True)
  

Я попытался перезапустить обучение с помощью :

 model_loaded = keras.models.load_model('saved_model')
model_loaded.fit(x_train, y_train, initial_epoch=3, epochs=5, batch_size=50, callbacks=[CustomCallback()])
  

Во время обучения я получил :

 Epoch 1/3
 9/10 [==========================>...] - ETA: 0s - loss: 0.3259 Number of iterations :  10
10/10 [==============================] - 0s 12ms/step - loss: 0.3249
Epoch 2/3
 9/10 [==========================>...] - ETA: 0s - loss: 0.2987 Number of iterations :  20
10/10 [==============================] - 0s 11ms/step - loss: 0.2980
Epoch 3/3
 9/10 [==========================>...] - ETA: 0s - loss: 0.2608 Number of iterations :  30
10/10 [==============================] - 0s 13ms/step - loss: 0.2586
  

После загрузки сохраненной модели и переподготовки я получил :

 Epoch 4/5
 9/10 [==========================>...] - ETA: 0s - loss: 0.2166 Number of iterations :  10
10/10 [==============================] - 0s 14ms/step - loss: 0.2148
Epoch 5/5
 6/10 [=================>............] - ETA: 0s - loss: 0.1861 Number of iterations :  20
10/10 [==============================] - 0s 10ms/step - loss: 0.1796

  

Я ожидаю, что количество итераций для 4-й эпохи составит 40.

Комментарии:

1. Насколько я понимаю, model.save (контрольная точка) должна содержать все… Почему он может пропустить ваше состояние оптимизатора: s? У вас есть свой код?

2. Вы можете попробовать сохранить с помощью saver, чтобы сохранить хорошую контрольную точку saver = tf.compat.v1.train. Saver() saver.save(train_sess, «trainfolder/ckpt», global_step=tf.train.get_global_step())

3. @dtlam26 Я только что загрузил свой код.

4. saved_model и pb рассматривается как статическая модель, которая была удалена оптимизатором из конвейера обучения. Следовательно, вы не можете загрузить его и ожидать, что оптимизатор будет сохранен. Это отличается от файла h5. Когда вы загружаете модель из h5, появляется параметр «compile». Если это верно, вы загружаете также свое состояние оптимизатора, иначе нет.

5. из-за этого инцидента, когда вы хотите использовать оптимизатор, я рекомендую вам сначала сохранить его в качестве контрольной точки, затем может появиться замороженный график или сохраненная модель