Как исправить 'Ошибка (и) в загрузке state_dict для AWD_LSTM' при использовании fast-ai - PullRequest
1 голос
/ 25 апреля 2019

Я использую библиотеку fast-ai для обучения образца набора данных обзоров IMDB. Моя цель - провести анализ настроений, и я просто хотел начать с небольшого набора данных (этот содержит 1000 обзоров IMDB). Я обучил модель на виртуальной машине, используя это руководство .

Я сохранил модель data_lm и data_clas, затем кодировщик ft_enc и после этого я сохранил ученика-классификатора sentiment_model. Затем я получил эти 4 файла с виртуальной машины и поместил их в мою машину и хотел использовать эти предварительно обученные модели для классификации настроений.

Вот что я сделал:

# Use the IMDB_SAMPLE file
path = untar_data(URLs.IMDB_SAMPLE)

# Language model data
data_lm = TextLMDataBunch.from_csv(path, 'texts.csv')

# Sentiment classifier model data
data_clas = TextClasDataBunch.from_csv(path, 'texts.csv', 
                                       vocab=data_lm.train_ds.vocab, bs=32)

# Build a classifier using the tuned encoder (tuned in the VM)
learn = text_classifier_learner(data_clas, AWD_LSTM, drop_mult=0.5)
learn.load_encoder('ft_enc')

# Load the trained model
learn.load('sentiment_model')

После этого я захотел использовать эту модель, чтобы предсказать настроение предложения. При выполнении этого кода я столкнулся со следующей ошибкой:

RuntimeError: Error(s) in loading state_dict for AWD_LSTM:
   size mismatch for encoder.weight: copying a param with shape torch.Size([8731, 400]) from checkpoint, the shape in current model is torch.Size([8888, 400]).
   size mismatch for encoder_dp.emb.weight: copying a param with shape torch.Size([8731, 400]) from checkpoint, the shape in current model is torch.Size([8888, 400]). 

А трассировка:

Traceback (most recent call last):
  File "C:/Users/user/PycharmProjects/SentAn/mainApp.py", line 51, in <module>
    learn = load_models()
  File "C:/Users/user/PycharmProjects/SentAn/mainApp.py", line 32, in load_models
    learn.load_encoder('ft_enc')
  File "C:\Users\user\Desktop\py_code\env\lib\site-packages\fastai\text\learner.py", line 68, in load_encoder
    encoder.load_state_dict(torch.load(self.path/self.model_dir/f'{name}.pth'))
  File "C:\Users\user\Desktop\py_code\env\lib\site-packages\torch\nn\modules\module.py", line 769, in load_state_dict
    self.__class__.__name__, "\n\t".join(error_msgs)))

Итак, ошибка возникает при загрузке энкодера. Но я также попытался удалить строку load_encoder, но такая же ошибка произошла на следующей строке learn.load('sentiment_model').

Я искал через форум fast-ai и заметил, что у других тоже была эта проблема, но не нашел решения. В этом посте пользователь говорит, что это может быть связано с другой предварительной обработкой, хотя я не мог понять, почему это произойдет.

Кто-нибудь имеет представление о том, что я делаю неправильно?

1 Ответ

2 голосов
/ 13 июня 2019

Кажется, словарный размер data_clas и data_lm различается. Я предполагаю, что проблема вызвана различной предварительной обработкой, используемой в data_clas и data_lm. Чтобы проверить мои предположения, я просто использовал

data_clas.vocab.itos = data_lm.vocab.itos

До следующей строки

learn_c = text_classifier_learner (data_clas, AWD_LSTM, drop_mult = 0.3)

Это исправило ошибку.

...