需要开始两次训练才能加载检查点(有效,但为什么?)



我正在修改deeplab网络。我在mobilenet-v3特征提取器的第一层中添加了一个节点,它重用了现有的变量。由于不需要额外的参数,理论上我可以加载旧的检查点。

出现了我无法理解的情况:

当我在一个新的空文件夹中开始训练时,加载这样的检查点:

python "${WORK_DIR}"/train.py 
#--didn't change other parameters 
--train_logdir="${EXP_DIR}/train" 
--fine_tune_batch_norm=true 
--tf_initial_checkpoint="init/deeplab/model.ckpt"

我得到一个错误:

ValueError: Total size of new array must be unchanged for MobilenetV3/Conv/BatchNorm/gamma lh_shape: [(16,)], rh_shape: [(480,)]

但是,如果我在一个新的空文件夹中开始训练,不要加载任何检查点:

python "${WORK_DIR}"/train.py 
#--didn't change other parameters 
--train_logdir="${EXP_DIR}/train" 
--fine_tune_batch_norm=false 
#--tf_initial_checkpoint="init/deeplab/model.ckpt" #i.e. no checkpoint

我可以顺利地开始训练。

更让我困惑的是,如果在同一个文件夹(,它是没有加载检查点的train_logdir(中,我尝试用检查点开始训练,我也可以毫无错误地开始训练:

# same code as the first code block
python "${WORK_DIR}"/train.py 
#--didn't change other parameters 
--train_logdir="${EXP_DIR}/train" 
--fine_tune_batch_norm=true 
--tf_initial_checkpoint="init/deeplab/model.ckpt"

这怎么会发生?--train_logdir是否可以以某种方式存储上次训练的批处理规范化参数的形状?

我在train_utils.py中发现了以下代码:(第203行(

if tf.train.latest_checkpoint(train_logdir):
tf.logging.info('Ignoring initialization; other checkpoint exists')
return None
tf.logging.info('Initializing model from path: %s', tf_initial_checkpoint)

它将尝试从train_ logdir中的现有检查点加载;tf_initial_checkpoint";旗帜

因此,当我第二次开始训练时,网络已经加载了第一次训练的变量,这与我预先训练的检查点无关。

我的实验还表明,像我一样开始两次训练并没有好的结果,因为当我正确加载预先训练的检查点时。

相关内容

  • 没有找到相关文章

最新更新