Необходимо дважды запустить обучение, чтобы загрузить контрольную точку (сработало, но почему?) - PullRequest
1 голос
/ 14 июля 2020

Я модифицирую сеть deeplab. Я добавил узел к первому уровню экстрактора функций mobil enet -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 может каким-то образом сохранить форму параметров пакетной нормализации из последнего обучения?

1 Ответ

0 голосов
/ 15 июля 2020

Я нашел следующий код в 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" flag.

Итак, когда я начинаю обучение во второй раз, Сеть загрузила переменные из первого обучения, что не имеет ничего общего с моей предварительно обученной контрольной точкой.

Мои эксперименты также показал, что запуск тренировки дважды, как у меня, не дает хорошего результата, так как при правильной загрузке предварительно обученной контрольной точки.

...