Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pytorch 预训练bert模型中的冻结层_Pytorch - Fatal编程技术网

Pytorch 预训练bert模型中的冻结层

Pytorch 预训练bert模型中的冻结层,pytorch,Pytorch,如何冻结上述预训练模型中的最后两层(辍学层和分类器层)?因此,当模型运行时,我将获得一个稠密层作为输出。您已经有稠密层作为输出(Linear) 无需冻结退出,因为它只在训练期间缩放激活。 您可以通过发出以下命令,将其设置为评估模式(基本上,该层之后不会执行任何操作): model.dropout.eval() 虽然如果通过model.train(),将整个模型设置为train,它将被更改,所以请注意这一点 要冻结最后一层的权重,可以发布: model.classifier.weight.req


如何冻结上述预训练模型中的最后两层(辍学层和分类器层)?因此,当模型运行时,我将获得一个稠密层作为输出。

您已经有稠密层作为输出(
Linear

无需冻结
退出
,因为它只在训练期间缩放激活。 您可以通过发出以下命令,将其设置为
评估
模式(基本上,该层之后不会执行任何操作):

model.dropout.eval()
虽然如果通过
model.train()
,将整个模型设置为
train
,它将被更改,所以请注意这一点

要冻结最后一层的权重,可以发布:

model.classifier.weight.requires_grad_(False)
(或
bias
,如果这是你想要的)

如果您想将最后一层更改为另一个形状而不是
(768,2)
,只需使用另一个模块覆盖它,例如

model.classifier = torch.nn.Linear(768, 10)

对于大小为
10
的输出张量(输入形状必须与模型中指定的形状完全一致,因此
768

我想向您指出的是的定义,您可以通过使用以下工具轻松避免丢失和分类器:

model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
model.bert() # this will give you the dense layer output
为什么你能做到以上几点?如果您查看BertForSequenceClassification的构造函数:

def __init__(self, config):
    super(BertForSequenceClassification, self).__init__(config)
    self.num_labels = config.num_labels

    self.bert = BertModel(config)
    self.dropout = nn.Dropout(config.hidden_dropout_prob)
    self.classifier = nn.Linear(config.hidden_size, self.config.num_labels)

    self.init_weights()
如您所见,您只需要忽略
下拉列表
分类器


还有一件事,冻结一层和移除一层是两件不同的事情。在您的问题中,您提到要冻结分类器层,但冻结层无助于避免它。冻结意味着,你不想训练图层。

对不起,我在哪里可以写这些行
model=BertForSequenceClassification.from_pretrained(“bert base uncased”,num_labels=2)model.bert()#这将给你密集图层输出
?我可以在哪里写这行
model.classifier.weight.required_grad(False)