我正在修改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";旗帜
因此,当我第二次开始训练时,网络已经加载了第一次训练的变量,这与我预先训练的检查点无关。
我的实验还表明,像我一样开始两次训练并没有好的结果,因为当我正确加载预先训练的检查点时。