Неожиданный ключ (и) в state_dict: "model", "opt" - PullRequest
0 голосов
/ 07 марта 2019

В настоящее время я использую fast.ai для обучения модели классификатора изображений.

data = ImageDataBunch.single_from_classes(path, classes, ds_tfms=get_transforms(), size=224).normalize(imagenet_stats)
learner = cnn_learner(data, models.resnet34)

learner.model.load_state_dict(
    torch.load('stage-2.pth', map_location="cpu")
)

, что приводит к:

torch.load ('stage-2.pth', map_location = "cpu") Файл "/usr/local/lib/python3.6/site-packages/torch/nn/modules/module.py", строка 769, в файле load_state_dict. class . name , "\ n \ t" .join (error_msgs))) RuntimeError: Ошибка (и) при загрузке state_dict для последовательных:

...

Неожиданноключ (и) в state_dict: "модель", "опт".

Я посмотрел в SO и попытался использовать следующее решение:

# original saved file with DataParallel
state_dict = torch.load('stage-2.pth', map_location="cpu")
# create new OrderedDict that does not contain `module.`
from collections import OrderedDict
new_state_dict = OrderedDict()
for k, v in state_dict.items():
    name = k[7:] # remove `module.`
    new_state_dict[name] = v
# load params
learner.model.load_state_dict(new_state_dict)

, что приводит к:

RuntimeError: Error (s)) при загрузке state_dict для Sequential:

Неожиданные ключи в state_dict: "".

Я использую Google Colab для обучения своей модели, а затем портирую обученную модель вДокер и попытаться разместить на локальном сервере.

В чем может быть проблема?Может ли это быть другая версия pytorch, которая приводит к несоответствию модели?

В моей конфигурации докера:

# Install pytorch and fastai
RUN pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html
RUN pip install fastai

Пока мой Colab использует следующее:

 !curl -s https://course.fast.ai/setup/colab | bash

1 Ответ

2 голосов
/ 07 марта 2019

Мое сильное предположение состоит в том, что stage-2.pth содержит два элемента верхнего уровня: сама модель (ее веса) и конечное состояние оптимизатора, который использовался для ее обучения. Чтобы загрузить только модель, вам нужно только первое. Предполагая, что все было сделано идиоматическим способом PyTorch, я бы попробовал

learner.model.load_state_dict(
    torch.load('stage-2.pth', map_location="cpu")['model']
)

Обновление: после применения моего первого раунда рекомендаций становится ясно, что вы загружаете созданную точку сохранения с другой (возможно, по-другому настроенной?) Моделью, чем та, в которую вы загружаете ее. Как вы можете видеть из пастбина, точка сохранения содержит веса для некоторых дополнительных слоев, которых нет в вашей модели, таких как bn3, downsample и т. Д.

"0.4.0.bn3.running_var", "0.4.0.bn3.num_batches_tracked", "0.4.0.downsample.0.weight"

в то же время некоторые другие ключевые имена совпадают, но тензоры имеют разные формы.

несоответствие размера для 0.5.0.downsample.0.weight: копирование параметра с факелом формы. Размер ([512, 256, 1, 1]) из контрольной точки, форма в текущей модели - torch.Size ([128 , 64, 1, 1]).

Я вижу шаблон, в котором вы последовательно пытаетесь загрузить параметр формы [2^(x+1), 2^x, 1, 1] вместо [2^(x), 2^(x-1), 1, 1]. Возможно, вы пытаетесь загрузить модель различной глубины (например, загрузка весов vgg-16 для vgg-11?). В любом случае вам необходимо выяснить точную архитектуру, использованную для создания точки сохранения, а затем воссоздать ее перед загрузкой точки сохранения.

PS. Если вы не были уверены - точки сохранения содержат веса моделей, а также их формы и (автоматически сгенерированные) имена. Они не содержат полную спецификацию самой архитектуры - вам нужно убедиться, что вы вызываете model.load_state_dict с model точно такой же архитектуры, которая использовалась для создания точки сохранения. В противном случае у вас могут быть несоответствующие имена весов.

...