使用微调模型的 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)
我使用 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)