Вывод 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
Итак, немного отличается от указанного в ошибке.
В любом случае, этот способ решения проблемы был бы немного громоздким, я бы предпочел более прямой способ.
1 ответ
Хорошо, исправил. По сути, во время обучения я сохранял файл.params, используя:
net.export(param_file)
и, как я уже сказал, загружая их во время вывода:
net.load_parameters(param_file)
Однако это не сработает, но сработает, если вместо экспорта я использую:
net.save_parameters(param_file)