我使用 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
因此,与错误中指示的略有不同。
无论如何,这种解决问题的方式会有点麻烦,我更喜欢更直接的方式。