如何解决"Variable is available in checkpoint, but has an incompatible shape with model variable"?

How to solve "Variable is available in checkpoint, but has an incompatible shape with model variable"?

我正在尝试从对象检测-API 重新训练现有的预训练网络。是ssd_mobilenet_v2。在 COCO 数据集上预训练。我正在根据固定到 obj-detection-API 的教程重现步骤。

模型仍然开始训练,但 % mAP 很低。我是 CNN 的新手,非常感谢您的帮助。

当我开始训练时,出现这个警告,我找不到解决方法。

我 运行 它在 google 协作笔记本中,使用此命令

# Training
!python object_detection/model_main.py \
--pipeline_config_path=${PIPELINE_CONFIG_PATH} \
--model_dir=${MODEL_DIR} \
--num_train_steps=${NUM_TRAIN_STEPS} \
--sample_1_of_n_eval_examples=$SAMPLE_1_OF_N_EVAL_EXAMPLES \
--alsologtostderrps

这是我收到的警告:

WARNING:root:Variable [FeatureExtractor/MobilenetV2/layer_19_2_Conv2d_2_3x3_s2_512/weights] is     available in checkpoint, but has an incompatible shape with model variable. Checkpoint shape: [[1, 1, 256, 512]], model variable shape: [[3, 3, 256, 512]]. This variable will not be initialized from the checkpoint.
WARNING:root:Variable [FeatureExtractor/MobilenetV2/layer_19_2_Conv2d_3_3x3_s2_256/weights] is available in checkpoint, but has an incompatible shape with model variable. Checkpoint shape: [[1, 1, 128, 256]], model variable shape: [[3, 3, 128, 256]]. This variable will not be initialized from the checkpoint.
WARNING:root:Variable [FeatureExtractor/MobilenetV2/layer_19_2_Conv2d_4_3x3_s2_256/weights] is available in checkpoint, but has an incompatible shape with model variable. Checkpoint shape: [[1, 1, 128, 256]], model variable shape: [[3, 3, 128, 256]]. This variable will not be initialized from the checkpoint.
WARNING:root:Variable [FeatureExtractor/MobilenetV2/layer_19_2_Conv2d_5_3x3_s2_128/weights] is available in checkpoint, but has an incompatible shape with model variable. Checkpoint shape: [[1, 1, 64, 128]], model variable shape: [[3, 3, 64, 128]]. This variable will not be initialized from the checkpoint.

在 运行 大约 10 分钟后,它打印出:

Accumulating evaluation results...
DONE (t=1.73s).
Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.000
Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.002
Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.000
Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000
Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.000
Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.000
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.006
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.040
Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.002
Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.026
Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.050

我没有更改 *.ckpt 文件只是下载了 ssd_mobilenet_v2_coco_2018_03_29 的原始预训练版本并使用了这些文件并将它们链接到 .config 文件中。

我想了一天多。 谢谢你的帮助。

你的错误信息说(取第一行,它们都是相似的):

layer_19_2_Conv2d_2_3x3_s2_512/weights is available in checkpoint, but has an incompatible shape with model variable. Checkpoint shape: [[1, 1, 256, 512]], model variable shape: [[3, 3, 256, 512]].

根据 的解释,检查点中的形状是 1x1 卷积(形状开头的 1,1)。 模型中的形状正确地是 3x3 卷积之一。 现在,这很奇怪,因为检查点 中的层名称 有“3x3”,尽管考虑到权重形状,这是错误的。

那么,您似乎正在使用一个检查点,该检查点对您遇到问题的层使用 1x1 卷积,尽管这些层的名称暗示是 3x3 卷积。作为使用现有检查点的解决方法,您可以尝试修改模型,修改构建它的函数,改为使用 1x1 卷积(尽管我不能确定那会在哪里)。

根据具有低 %mAP,这当然是由于模型的一部分重新初始化并且未正确加载。

我最近 运行 遇到了与 Miroslav 相同的问题(完全相同的 4 条警告消息)。虽然@GPhilo 是正确的,此警告消息意味着检查点与模型不匹配,但生成此特定 pre-trained 检查点似乎存在问题。具体来说,ssd_mobilenet_v2_coco_2018_03_29.tar.gz 检查点似乎是使用配置文件的 pre-release 版本生成的。这是 GitHub 上相关问题的 link: https://github.com/tensorflow/models/issues/5315

最后,我从 tensorflow/models git 存储库中的 ssd_mobilenet_v2_coco.config 文件切换到 pre-trained 检查点中包含的 pipeline.config 文件。除了需要更改的正常设置外,您还需要删除 batch_norm_trainable 标志。有关此错误的更多信息在这里: https://github.com/tensorflow/models/issues/4066

注意:我的第一次尝试是切换到 MobileNet V2 SSD 的量化版本,但是在 re-training 模型与我的数据集之后,我没有得到我希望的准确性(不知道为什么).