首页 > 解决方案 > 使用微调模型进行 GluonCV 推理 - “请确保源网络和目标网络具有相同的前缀”错误

问题描述

我使用 GluonCV 微调对象检测模型以识别一些自定义类,主要遵循相关教程

我尝试使用“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

因此,与错误中指示的略有不同。

无论如何,这种解决问题的方式会有点麻烦,我更喜欢更直接的方式。

标签: mxnetmxnet-gluon

解决方案


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

net.export(param_file)

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

net.load_parameters(param_file)

但是,它不能以这种方式工作,但如果我使用而不是 export 则它可以:

net.save_parameters(param_file)

推荐阅读