Python:BERT 错误 - 初始化 BertModel 时未使用模型检查点的某些权重
Posted
技术标签:
【中文标题】Python:BERT 错误 - 初始化 BertModel 时未使用模型检查点的某些权重【英文标题】:Python: BERT Error - Some weights of the model checkpoint at were not used when initializing BertModel 【发布时间】:2021-08-05 08:54:14 【问题描述】:我正在使用 bert-base-uncased
在 PyTorch 中创建一个实体提取模型,但是当我尝试运行该模型时出现此错误:
错误:
Some weights of the model checkpoint at D:\Transformers\bert-entity-extraction\input\bert-base-uncased_L-12_H-768_A-12 were not used when initializing BertModel:
['cls.predictions.transform.dense.bias', 'cls.predictions.decoder.weight', 'cls.seq_relationship.weight', 'cls.predictions.transform.LayerNorm.bias', 'cls.seq_relationship.bias',
'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.dense.weight',
'cls.predictions.bias']
- This IS expected if you are initializing BertModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
- This IS NOT expected if you are initializing BertModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
我从here下载了bert模型,从here下载了附加文件
代码
以下是我的模型的代码:
import config
import torch
import transformers
import torch.nn as nn
def loss_fn(output, target, mask, num_labels):
lfn = nn.CrossEntropyLoss()
active_loss = mask.view(-1) == 1
active_logits = output.view(-1, num_labels)
active_labels = torch.where(
active_loss,
target.view(-1),
torch.tensor(lfn.ignore_index).type_as(target)
)
loss = lfn(active_logits, active_labels)
return loss
class EntityModel(nn.Module):
def __init__(self, num_tag, num_pos):
super(EntityModel, self).__init__()
self.num_tag = num_tag
self.num_pos = num_pos
self.bert = transformers.BertModel.from_pretrained(config.BASE_MODEL_PATH)
self.bert_drop_1 = nn.Dropout(p = 0.3)
self.bert_drop_2 = nn.Dropout(p = 0.3)
self.out_tag = nn.Linear(768, self.num_tag)
self.out_pos = nn.Linear(768, self.num_pos)
def forward(self, ids, mask, token_type_ids, target_pos, target_tag):
o1, _ = self.bert(ids,
attention_mask = mask,
token_type_ids = token_type_ids)
bo_tag = self.bert_drop_1(o1)
bo_pos = self.bert_drop_2(o1)
tag = self.out_tag(bo_tag)
pos = self.out_pos(bo_pos)
loss_tag = loss_fn(tag, target_tag, mask, self.num_tag)
loss_pos = loss_fn(pos, target_pos, mask, self.num_pos)
loss = (loss_tag + loss_pos) / 2
return tag, pos, loss
print("model.py run success!")
【问题讨论】:
这不是错误。 但是在这个警告之后模型训练没有发生? 您需要训练模型,因为这个模型没有经过训练的输出标头。如果您不想训练它,您可以寻找适合您任务的带有预训练头部的 bert 模型。 我有一个名为train.py
的培训文件,但是当我运行它时,我收到了这个警告
这是应该发生的。当您在训练后加载模型时,您不会看到此错误消息。
【参考方案1】:
正如@cronoik 和提到的here 一样,这不是错误,但此警告意味着在您的训练期间,您没有使用池化器来计算损失。因此,如果是这种情况,则无需担心。
您可以通过以下方式设置此警告:
from transformers import logging
logging.set_verbosity_warning()
【讨论】:
【参考方案2】:正如 R. Marolahy 建议的那样,如果您不想每次都看到这个,我知道我不想,添加以下内容:
from transformers import logging
logging.set_verbosity_error()
【讨论】:
以上是关于Python:BERT 错误 - 初始化 BertModel 时未使用模型检查点的某些权重的主要内容,如果未能解决你的问题,请参考以下文章
[Python人工智能] 三十三.Bert模型 keras-bert库构建Bert模型实现文本分类
[Python人工智能] 三十四.Bert模型 keras-bert库构建Bert模型实现微博情感分析