У меня есть такой CNN: input-> layer1 -> layer->2->output
.
Между тем, у меня есть предварительно обученная модель (файлы ckpt), полученная из других сетей, которая также имеет «layer1».
Чего я хочу добиться: использовать предварительно обученный файл ckpt для восстановления только «layer1» CNN. Затем я замораживаю «layer1» и обновляю «layer2» только во время тренировки.
Но я не знаю, как этого добиться с помощью функции tf.esimator.train_and_evaluate()
.
Я знаю, как добиться того же самого с помощью базовых подпрограмм Tensorflow
, таких как session.run(), initializer()
и restore()
.
Как показано ниже, я могу восстановить ckpt старым способом:
##### After defining network ########
session.run(tf.variables_initializer(uninitialized_variables))
variables_to_restore = slim.get_variables(scope="layer1")
restorer = tf.train.Saver(variables_to_restore)
restorer.restore(session, save_path=checkpoint_path)
session.run(something)
Но на этот раз мне нужно изменить следующий код для восстановления ckpt:
train_input_fn = get_input_fn(is_training=True)
val_input_fn = get_input_fn(is_training=False)
estimator = tf.estimator.Estimator(model_fn, params=model_params, config=run_config)
train_spec = tf.estimator.TrainSpec(train_input_fn, max_steps=input_params['num_steps'])
eval_spec = tf.estimator.EvalSpec(val_input_fn, steps=None, start_delay_secs=1800, throttle_secs=1800)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
Я думаю, Tensorflow
надеялся упростить реализацию с помощью процедур-оболочек, таких как tf.estimator.train_and_evaluate()
. Но это усложняет выполнение различных более гибких операций.
Может ли кто-нибудь дать какое-нибудь руководство, где я должен изменить, чтобы он восстанавливал «layer1» только при использовании tf.estimator.train_and_evaluate
?