Сохраните обновленные веса/размеры для предварительно обученной модели Берта (думаю, я правильно спрашиваю)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сохраните обновленные веса/размеры для предварительно обученной модели Берта (думаю, я правильно спрашиваю)

Сообщение Anonymous »

Я новичок в машинном обучении, поэтому прошу прощения, если это не совсем понятно, но я постараюсь быть максимально кратким.
Я настраиваю предварительно обученную модель BERT, в частности «без оболочки на основе bert», и частью этого было обновление размера встраивания модели, чтобы я мог добавлять новые токены, а именно смайлики, чтобы токенизатор мог правильно токенизировать указанные смайлы. . Это было сделано таким образом:

Код: Выделить всё

model = BertForSequenceClassification.from_pretrained('bert-base-uncased',
num_labels = 2,
output_attentions = False,
output_hidden_states = False)
weights = model.bert.embeddings.word_embeddings.weight.data
new_weights = torch.cat((weights, weights[101:3399]), 0)
new_emb = nn.Embedding.from_pretrained(new_weights, padding_idx=0, freeze=False)
model.bert.embeddings.word_embeddings = new_emb
Он прошел обучение, и я сохранил его, чтобы иметь возможность загрузить его в будущем, но при попытке загрузить модель в отдельный скрипт для целей оценки я получаю несоответствие размера тензора ошибка. В частности:

Код: Выделить всё

Error(s) in loading state_dict for BertForSequenceClassification:
size mismatch for bert.embeddings.word_embeddings.weight: copying a param with shape torch.Size([33820, 768]) from checkpoint, the shape in current model is torch.Size([30522, 768]).
You may consider adding `ignore_mismatched_sizes=True` in the model `from_pretrained` method
У меня есть обходной путь, но я думаю, что это бесполезно, и, честно говоря, мне это не нравится, потому что в идеале я хотел бы иметь что-то масштабируемое, я думаю? Существует вероятность того, что мне придется добавлять новые токены, и мне не нравится идея вручную изменять их размер каждый раз, когда я загружаю модель. Я не уверен, как правильно сохранить модель и ее текущий вес.
Вот обходной путь:

Код: Выделить всё

model = BertForSequenceClassification.from_pretrained(model_dir, num_labels=2, ignore_mismatched_sizes=True)
weights = model.bert.embeddings.word_embeddings.weight.data
new_weights = torch.cat((weights, weights[101:3399]), 0)
new_emb = nn.Embedding.from_pretrained(new_weights, padding_idx=0, freeze=False)
model.bert.embeddings.word_embeddings = new_emb

model.load_state_dict(torch.load(state_dict_dir, weights_only=True))
tokenizer = BertTokenizer.from_pretrained(model_dir, do_lower_case=True)
Как правильно выполнить то, что я пытаюсь сделать? Если мне что-то непонятно, скажите об этом, и я сделаю все возможное, чтобы прояснить ситуацию.

Подробнее здесь: https://stackoverflow.com/questions/791 ... g-this-cor
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»