繁体   English   中英

如何设置检查点进行微调

[英]How to set the checkpoint for fine-tuning

当我在训练开始时从model_zoo重新训练模型(ssd_mobilenetv2)时,我发现损失非常大,而validation_set的准确性很好。 培训日志如下:

日志不能来自训练模型。 我怀疑它没有加载检查点来进行微调。 请帮助我如何使用相同数据集上的训练模型进行微调。 我根本没有修改网络结构。

我在pipeline.config中设置了检查点路径,如下所示:fine_tune_checkpoint:“ / / sdd_mobilenet_v2_coco_2018_03_29 / mode.ckpt”如果我将model_dir设置为我的下载目录,由于global_train_step大于max_step,因此不会进行训练。 然后我放大max_step,我可以看到从checkpoint恢复参数的日志。 但它会遇到无法恢复某些参数的错误。 所以我将model_dir设置为空目录。 它可以正常训练,但步骤0中的损失将非常大。 验证结果非常糟糕

在pipeline.config中

fine_tune_checkpoint: "/ssd_mobilenet_v2_coco_2018_03_29/model.ckpt"
num_steps: 200000
fine_tune_checkpoint_type: "detection"

火车脚本

model_dir = '/ssd_mobilenet_v2_coco_2018_03_29/retrain0524

pipeline_config_path = '/ssd_mobilenet_v2_coco_2018_03_29/pipeline.config'

checkpoint_dir = '/ssd_mobilenet_v2_coco_2018_03_29/model.ckpt'

num_train_steps = 300000
config = tf.estimator.RunConfig(model_dir=model_dir)
train_and_eval_dict = model_lib.create_estimator_and_inputs(
    run_config=config,
    hparams=model_hparams.create_hparams(hparams_overrides),
    pipeline_config_path=pipeline_config_path,    
    sample_1_of_n_eval_examples=sample_1_of_n_eval_examples,
    sample_1_of_n_eval_on_train_examples=(sample_1_of_n_eval_on_train_examples))
estimator = train_and_eval_dict['estimator']
train_input_fn = train_and_eval_dict['train_input_fn']
eval_input_fns = train_and_eval_dict['eval_input_fns']
eval_on_train_input_fn = train_and_eval_dict['eval_on_train_input_fn']
predict_input_fn = train_and_eval_dict['predict_input_fn']
train_steps = train_and_eval_dict['train_steps']

train_spec, eval_specs = model_lib.create_train_and_eval_specs(
        train_input_fn,
        eval_input_fns,
        eval_on_train_input_fn,
        predict_input_fn,
        train_steps,
        eval_on_train_data=False)

tf.estimator.train_and_evaluate(estimator, train_spec, eval_specs[0])

INFO:tensorflow:loss = 356.25497,step = 0 INFO:tensorflow:global_step / sec:1.89768 INFO:tensorflow:loss = 11.221423,step = 100(52.700 sec)INFO:tensorflow:global_step / sec:2.21685 INFO:tensorflow:loss = 10.329516,步= 200(45.109秒)

如果初始训练损失为400,则模型最有可能从检查点成功恢复,而不是与检查点完全相同。

ssd模型的restore_map函数,请注意,即使您设置了fine_tune_checkpoint_type : detection ,甚至提供了完全相同的模型检查点,仍然只会恢复feature_extractor范围中的变量。 要从检查点恢复尽可能多的变量,您必须在配置文件中设置load_all_detection_checkpoint_vars: true

def restore_map(self,
              fine_tune_checkpoint_type='detection',
              load_all_detection_checkpoint_vars=False):

if fine_tune_checkpoint_type not in ['detection', 'classification']:
  raise ValueError('Not supported fine_tune_checkpoint_type: {}'.format(
      fine_tune_checkpoint_type))

if fine_tune_checkpoint_type == 'classification':
  return self._feature_extractor.restore_from_classification_checkpoint_fn(
      self._extract_features_scope)

if fine_tune_checkpoint_type == 'detection':
  variables_to_restore = {}
  for variable in tf.global_variables():
    var_name = variable.op.name
    if load_all_detection_checkpoint_vars:
      variables_to_restore[var_name] = variable
    else:
      if var_name.startswith(self._extract_features_scope):
        variables_to_restore[var_name] = variable

return variables_to_restore

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM