Я настраиваю предварительно обученную модель 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