Получите векторы функций от BertForSequenceClassification - PullRequest
0 голосов
/ 04 февраля 2020

Я успешно создал инструмент анализа настроений с помощью BertForSequenceClassification из обнимающего лица / трансформаторов , чтобы классифицировать твиты $ 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 состоит только из логитов.

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)

Ответы [ 2 ]

1 голос
/ 13 марта 2020

У меня также есть эта проблема после тонкой настройки 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, :]
0 голосов
/ 05 февраля 2020

BertForSequenceClassification - это обертка, состоящая из двух частей: модель BERT (атрибут bert) и классификатор (атрибут classifier).

Вы можете вызвать непосредственно подчиненную модель BERT. Если вы передадите свой ввод непосредственно в него, вы получите скрытые состояния. Возвращает кортеж: первый член кортежа - это скрытые состояния, второй - вектор [CLS].

...