Восстановить лучшую контрольную точку для оценки тензорного потока 2.x - PullRequest
1 голос
/ 28 февраля 2020

Вкратце, я ввел в действие систему ввода данных с использованием API-интерфейса tenorflow Dataset. Затем я реализовал модель CNN для классификации с использованием керас, которую я преобразовал в оценщик. Я добавил свои оценки Train и 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.

Большое спасибо, любая помощь оценили.

1 Ответ

0 голосов
/ 22 апреля 2020

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

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

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

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))

Пример использования класса Вы просто замените экспортер, вызвав класс и передавая serve_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: использовать модель load_weights API Ссылочный 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.

...