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

Ana*_*ddy 2 pytorch

预训练的 BERT 模型

如何冻结上述预训练模型中的最后两层(dropout 和分类器层)?这样当模型运行时,我会得到一个密集层作为输出。

Was*_*mad 7

我想向您指出BertForSequenceClassification的定义,您可以使用以下方法轻松避免丢失和分类器:

model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
model.bert() # this will give you the dense layer output
Run Code Online (Sandbox Code Playgroud)

为什么你可以做到以上几点?如果你看一下 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()
Run Code Online (Sandbox Code Playgroud)

如您所见,您只想忽略dropoutclassifier层。

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