mxnet - 使用微调模型进行 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
因此,与错误中指示的略有不同。
无论如何,这种解决问题的方式会有点麻烦,我更喜欢更直接的方式。
解决方案
好的,修好了。基本上,在培训期间,我使用以下方法保存 .params 文件:
net.export(param_file)
并且,正如我所说,在推理过程中通过以下方式加载它们:
net.load_parameters(param_file)
但是,它不能以这种方式工作,但如果我使用而不是 export 则它可以:
net.save_parameters(param_file)
推荐阅读
- typescript - `xit` 和 `it.only` 的 TsLint 规则
- php - 如何强制浏览器重新缓存图像
- sql - 在 SQL Server 中将字符串转换为位(32)替代?
- python - 在Python中使用户名不区分大小写的好方法是什么?(初级水平)
- flutter - 如何在 widgetTree 之外访问 rxdart-bloc 函数?
- keycloak - 如何在不使用角色映射 API 的情况下创建具有自定义领域角色的 keycloak 用户?
- angular - 为什么我的域不重定向到 https?
- reactjs - React app calls a request in a loop when you open a page
- shell - 如何使用vim脚本在函数中执行命令
- python - Python“新风格”多重继承结合多个 __init__ 参数