使用微调模型的 GluonCV 推理 - “请确保源网络和目标网络具有相同的前缀”错误

GluonCV inference with finetuned model - “Please make sure source and target networks have the same prefix” error

我使用 GluonCV 微调对象检测模型以识别一些自定义 类,主要遵循 related tutorial.

我尝试同时使用“ssd_512_resnet50_v1_coco”和“ssd_512_mobilenet1.0_coco”作为基础模型,训练过程成功结束(验证数据集的准确性相当高).

问题是,我尝试 运行 使用新训练的模型进行推理,例如:

classes = ["CML_mug", "person"]
net = gcv.model_zoo.get_model('ssd_512_mobilenet1.0_custom',
                      classes=classes,
                      pretrained_base=False,
                      ctx=ctx)
net.load_params("saved_weights/-0070.params", ctx=ctx)

但我得到错误:

AssertionError: Parameter 'mobilenet0_conv0_weight' is missing in file: saved_weights/CML_mobilenet_00/-0000.params, which contains parameters: 'ssd0_ssd0_mobilenet0_conv0_weight', 'ssd0_ssd0_mobilenet0_batchnorm0_gamma', 'ssd0_ssd0_mobilenet0_batchnorm0_beta', ..., 'ssd0_ssd0_ssdanchorgenerator2_anchor_2', 'ssd0_ssd0_ssdanchorgenerator3_anchor_3', 'ssd0_ssd0_ssdanchorgenerator4_anchor_4', 'ssd0_ssd0_ssdanchorgenerator5_anchor_5'. Please make sure source and target networks have the same prefix.

所以,似乎网络参数在 .params 文件和我用于推理的模型中的命名不同。具体来说,在.params文件中,网络权重的名称以字符串“ssd0_ssd0_”为前缀,这导致调用net.load_parameters时出错。 过去我多次执行整个过程都没有问题,有什么改变吗?我在 运行 Ubuntu 18.04 上使用 mxnet-mkl (1.6.0) 和 gluoncv (0.7.0)。

我尝试通过以下方式加载 .params 文件:

from mxnet import nd
model = nd.load(0070.param)

我想修改它并删除导致问题的“ssd0_ssd0_”字符串。 我正在尝试浏览字典,但在键之间我只找到了一个:

ssd0_resnetv10_conv0_weight

所以,与错误中指示的略有不同。

反正这样解决问题会有点麻烦,我更喜欢直接一点的方式

好的,已修复。基本上,在训练期间,我使用以下方法保存 .params 文件:

net.export(param_file)

并且,正如我所说,在推理过程中通过以下方式加载它们:

net.load_parameters(param_file)

但是,它不是这样工作的,但如果我使用以下命令而不是导出,它就可以工作:

net.save_parameters(param_file)