0

我已经成功地构建了一个情绪分析工具,BertForSequenceClassificationhuggingface/transformers将 $tsla 推文分类为正面或负面。

但是,我不知道如何[CLS]从我的微调模型中获取每条推文的特征向量(更具体地说是 的嵌入)。

使用模型的更多信息:

model = BertForSequenceClassification.from_pretrained(OUTPUT_DIR, num_labels=num_labels)
model.config.output_hidden_states = True
tokenizer = BertTokenizer(OUTPUT_DIR+'vocab.txt')

但是,当我运行下面的代码时,output变量只包含 logits。

model.eval()
eval_loss = 0
nb_eval_steps = 0
preds = []

for input_ids, input_mask, segment_ids, label_ids in tqdm_notebook(eval_dataloader, desc="Evaluating"):
    input_ids = input_ids.to(device)
    input_mask = input_mask.to(device)
    segment_ids = segment_ids.to(device)
    label_ids = label_ids.to(device)

    with torch.no_grad():
        output = model(input_ids,token_type_ids= segment_ids,attention_mask= input_mask)
4

2 回答 2

1

我在微调 BertForSequenceClassification 后也遇到了这个问题。我知道您的目的是获取 [CLS] 的隐藏状态作为每条推文的表示。正确的?作为API 文档的说明,我认为代码是:

model = BertForSequenceClassification.from_pretrained(OUTPUT_DIR, output_hidden_states=True)
logits, hidden_states = model(input_ids, attn_masks)
cls_hidden_state = hidden_states[-1][:, 0, :] # the first hidden state in last layer

或者

model = BertForSequenceClassification.from_pretrained(OUTPUT_DIR, output_hidden_states=True)
last_hidden_states = model.bert(input_ids, attn_masks)[0]
cls_hidden_state = last_hidden_states[:, 0, :]
于 2020-03-13T07:49:20.983 回答
0

BertForSequenceClassification是一个包装器,由两部分组成:BERT 模型(属性bert)和分类器(属性classifier)。

你可以直接调用下面的 BERT 模型。如果您将输入直接传递给它,您将获得隐藏状态。它返回一个元组:元组的第一个成员都是隐藏状态,第二个是[CLS]向量。

于 2020-02-05T10:46:23.640 回答