关于model()输出从`pytorch-pretrained-bert`迁移到`pytorch-transformers`问题>>

问题描述 投票:0回答:1

我在将代码从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对象不再是包含12个隐藏层的完整列表,而是一个形状为encoded_layers的单个割炬张量对象,这将导致以下结果:尝试创建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对象的第一个元素替换为,但这不能使我访问嵌入的倒数第二个隐藏层。

我如何使用它?

谢谢!

我在将代码从pytorch_pretrained_bert迁移到pytorch_transformers时遇到了麻烦。我正在尝试进行余弦相似度练习。我想提取第二个...的文字嵌入值...] >>

首先,最新版本称为encoded_layers(不是pytorch-transformers)。

您需要告诉模型您希望获得所有隐藏状态

transformers

然后,您将在输出元组中找到期望的输出作为第三项:

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

IIRC这些层现在还包括嵌入(因此总共有13个项目),因此您可能需要更新索引以获取倒数第二层。最好使用负索引来确保(-2)。

python cosine-similarity pre-trained-model huggingface-transformers
1个回答
0
投票

首先,最新版本称为encoded_layers(不是pytorch-transformers)。

您需要告诉模型您希望获得所有隐藏状态

© www.soinside.com 2019 - 2024. All rights reserved.