Миграция от проблемы `pytorch-pretrained-bert` к проблеме` pytorch-transformers 'относительно выхода модели () - PullRequest
0 голосов
/ 21 февраля 2020

У меня проблемы с переносом моего кода с pytorch_pretrained_bert на pytorch_transformers. Я пытаюсь выполнить упражнение по сходству косинусов. Я хочу извлечь значения текстовых вложений из предпоследнего из 12 скрытых слоев внедрения.


import torch
from pytorch_pretrained_bert import BertTokenizer, BertModel
#from pytorch_transofmers import BertTokenizer, BertModel
import pandas as pd
import numpy as np

model = BertModel.from_pretrained('bert-base-uncased')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# This is done by default in the pytorch_transformers
model.eval() 

input_query = "This is my test input query text"
marked_text = "[CLS] " + input_query + " [SEP]"
tokenized_text = tokenizer.tokenize(marked_text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
segments_ids = [1] * len(tokenized_text)
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])
with torch.no_grad():
    encoded_layers, _ = model(tokens_tensor, segments_tensors)
    sentence_embedding = torch.mean(encoded_layers[10], 1)

Использование pytorch_pretrained_bert прекрасно работает с приведенным выше кодом. Мой encoded_layers объект представляет собой список из 12 тензоров скрытых слоев, что позволяет мне выбирать и уменьшать 11-й слой, беря среднее значение, в результате чего sentence_embedding объект, с которым я могу запустить косинус сходства.

Однако, когда Я перенесу свой код в библиотеку pytorch_transformers, получившийся объект encoded_layers больше не является полным списком из 12 скрытых слоев, а представляет собой объект-тензор с одним факелом формы torch.Size([1, 7, 768]), что приводит к следующей ошибке при попытке создать объект sentence_embedding:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-23-7f877a7d2f9c> in <module>
      9         encoded_layers, _ = model(tokens_tensor, segments_tensors)
     10         test = encoded_layers[0]
---> 11         sentence_embedding = torch.mean(test[10], 1)
     12 

IndexError: index 10 is out of bounds for dimension 0 with size 7

В документации по миграции (https://huggingface.co/transformers/migration.html) говорится, что я должен взять первый элемент объекта encoded_layers в качестве замены, но это не предоставлять мне доступ ко второму или последнему скрытому слою вложений.

Как я могу получить к нему доступ?

Спасибо!

1 Ответ

1 голос
/ 25 февраля 2020

Прежде всего, самая новая версия называется transformers (не pytorch-преобразователи).

Вам нужно сообщить модели, что вы sh получите все скрытые состояния

model = BertModel.from_pretrained('bert-base-uncased', output_hidden_states=True)

Затем вы увидите ожидаемый результат в качестве третьего элемента в выходном кортеже:

 encoded_layers = model(tokens_tensor, segments_tensors)[2]

IIR C эти слои теперь также включают вложения (так что всего 13 элементов) , поэтому вам может потребоваться обновить индекс, чтобы получить второй последний слой. Может быть лучше использовать отрицательный индекс, чтобы быть уверенным (-2).

...