Восстановить лучшую контрольную точку в тензорном потоке 2.x оценщика

Вкратце, я создал конвейер ввода данных с помощью tenorflow Dataset API. Затем я реализовал модель CNN для классификации с использованием keras, которую преобразовал в оценщик. Я накормил свой оценщик Train and Eval Specs своим input_fn, предоставив входные данные для обучения и оценки. И в качестве последнего шага я начал обучение модели с tf.estimator.train_and_evaluate

def my_input_fn(tfrecords_path):

    dataset = (...)
    return batch_fbanks, batch_labels

def build_model():
    model = tf.keras.models.Sequential()
    model.add(...)
    model.compile(...)

    return model

model = build_model()

run_config=tf.estimator.RunConfig(model_dir,save_summary_steps=100,save_checkpoints_steps=1000)
estimator = tf.keras.estimator.model_to_estimator(model,config=run_config)

def serving_input_receiver_fn():
    inputs = {'Conv1_input': tf.compat.v1.placeholder(shape=[None, 11,120,1], dtype=tf.float32)}
    return tf.estimator.export.ServingInputReceiver(inputs, inputs)

exporter = tf.estimator.BestExporter(serving_input_receiver_fn, name="best_exporter", exports_to_keep=5)

train_spec_dnn = tf.estimator.TrainSpec(input_fn = lambda: my_input_fn(train_data_path),hooks=[hook])
eval_spec_dnn = tf.estimator.EvalSpec(input_fn = lambda: my_eval_input_fn(eval_data_path),exporters=exporter,start_delay_secs=0,throttle_secs=15)

tf.estimator.train_and_evaluate(estimator, train_spec_dnn, eval_spec_dnn)

Я сохраняю 5 лучших контрольных точек, используя tf.estimator.BestExporter, как показано выше. После завершения обучения я хочу перезагрузить лучшую модель и преобразовать ее в оценщик, чтобы повторно оценить модель и спрогнозировать новый набор данных. Однако моя проблема заключается в восстановлении контрольной точки для оценщика. Я пробовал несколько решений, но каждый раз, когда я не получаю объект оценки, мне нужно запускать его методы evaluate и predict.

Чтобы указать больше, каждая из лучших директорий контрольных точек организована следующим образом:

./
  variables/
      variables.data-00000-of-00002
      variables.data-00001-of-00002
      variables.index
  saved_model.pb

Итак, вопрос в том, как я могу получить объект оценки с лучшей контрольной точки, чтобы я мог использовать его для оценки моей модели и прогнозирования новых данных?

Примечание. Я нашел несколько предлагаемых решений, основанных на функциях TensorFlow v1, которые не могут решить мою проблему, потому что я работаю с TF v2.

Большое спасибо, любая помощь приветствуется.


person sonson11    schedule 28.02.2020    source источник


Ответы (1)


Вы можете использовать приведенный ниже класс, созданный из tf.estimator.BestExporter

Что он делает, так это за исключением сохранения лучшей модели (файлов .pb и т. Д.), Он также сохраняет контрольную точку наилучшей экспортируемой модели в другой папке.

Ниже представлен класс:

import shutil, glob, os
# import tensorflow.logging as logging
## the path where all the checkpoint reside
BEST_CHECKPOINTS_PATH_FROM = 'PATH TO ALL CHECKPOINT FILES'
## the path it will save the best exporter checkpoint files
BEST_CHECKPOINTS_PATH_TO = 'PATH TO BEST EXPORTER CHECKPOINT FILES TO BE SAVE' 

class BestCheckpointsExporter(tf.estimator.BestExporter):
      def export(self, estimator, export_path, checkpoint_path, eval_result,is_the_final_export):
          if self._best_eval_result is None or \
                    self._compare_fn(self._best_eval_result, eval_result):
                    #print('Exporting a better model ({} instead of {})...'.format(eval_result, self._best_eval_result))
              for name in glob.glob(checkpoint_path + '.*'):
                    print(name)
                    print(os.path.join(BEST_CHECKPOINTS_PATH_TO, os.path.basename(name)))
                    shutil.copy(name, os.path.join(BEST_CHECKPOINTS_PATH_TO, os.path.basename(name)))
                # also save the text file used by the estimator api to find the best checkpoint
              with open(os.path.join(BEST_CHECKPOINTS_PATH_TO, "checkpoint"), 'w') as f:
                    f.write("model_checkpoint_path: \"{}\"".format(os.path.basename(checkpoint_path)))
              self._best_eval_result = eval_result
          else:
              print('Keeping the current best model ({} instead of {}).'.format(self._best_eval_result, eval_result))

Пример использования класса
Вы просто замените экспортер, вызвав класс и передав serv_input_receiver_fn.

def serving_input_receiver_fn():
    inputs = {'my_dense_input': tf.compat.v1.placeholder(shape=[None, 4], dtype=tf.float32)}
    return tf.estimator.export.ServingInputReceiver(inputs, inputs)

exporter = BestCheckpointsExporter(serving_input_receiver_fn=serving_input_receiver_fn) 

train_spec_dnn = tf.estimator.TrainSpec(input_fn = input_fn, max_steps=5)

eval_spec_dnn = tf.estimator.EvalSpec(input_fn=input_fn,exporters=exporter,start_delay_secs=0,throttle_secs=15)
(x, y) =  tf.estimator.train_and_evaluate(keras_estimator, train_spec_dnn, eval_spec_dnn)

На этом этапе он сохранит файлы контрольных точек модели с наилучшим экспортом в указанную вами папку.

Для загрузки файлов контрольных точек вам необходимо выполнить следующие шаги:
Шаг 1. Восстановите экземпляр модели

def build_model():
    model = tf.keras.models.Sequential()
    model.add(...)
    model.compile(...)

    return model

model = build_model()

Шаг 2. Используйте API модели load_weights
Ссылочный URL: https://www.tensorflow.org/tutorials/keras/save_and_load

ck_path = tf.train.latest_checkpoint('PATH TO BEST EXPORTER CHECKPOINT FILES')
model.load_weights(ck_path)

## From there you will be able to call the predict & evaluate the functionality of the trained model

##PREDICT
prediction = model.predict(x)

##EVALUATE
for features_batch, labels_batch in input_fn().take(1):
  model.evaluate(features_batch, labels_batch)

Примечание. Все это смоделировано в Google Colab.

person TF_Support    schedule 22.04.2020