从 `pytorch-pretrained-bert` 迁移到 `pytorch-transformers` 关于模型()输出的问题
Migrating from `pytorch-pretrained-bert` to `pytorch-transformers` issue regarding model() output
我在将代码从 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
对象的第一个元素作为替换,但这并没有让我访问倒数第二个隐藏层嵌入。
如何访问它?
谢谢!
首先,最新版本称为transformers
(不是pytorch-transformers)。
您需要告诉模型您希望获得所有隐藏状态
model = BertModel.from_pretrained('bert-base-uncased', output_hidden_states=True)
然后,您将在输出元组的第三项中找到您的预期输出:
encoded_layers = model(tokens_tensor, segments_tensors)[2]
IIRC 这些层现在还包括嵌入(因此总共有 13 个项目),因此您可能需要更新索引以获取倒数第二层。可能最好使用负索引来确定 (-2)。
我在将代码从 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
对象的第一个元素作为替换,但这并没有让我访问倒数第二个隐藏层嵌入。
如何访问它?
谢谢!
首先,最新版本称为transformers
(不是pytorch-transformers)。
您需要告诉模型您希望获得所有隐藏状态
model = BertModel.from_pretrained('bert-base-uncased', output_hidden_states=True)
然后,您将在输出元组的第三项中找到您的预期输出:
encoded_layers = model(tokens_tensor, segments_tensors)[2]
IIRC 这些层现在还包括嵌入(因此总共有 13 个项目),因此您可能需要更新索引以获取倒数第二层。可能最好使用负索引来确定 (-2)。