bert 提取特征每次返回不同层值(向量),是否运行良好?

uqxowvwt  于 5个月前  发布在  其他
关注(0)|答案(6)|浏览(76)

嘿,伙计们,
我已经用相同的输入文本测试了extract_features.py,发现它每次返回的层值都不同。
(来自源代码:layer_value = [round(float(x), 6) for x in layer_output[i:(i + 1)].flat])
我只是希望如果我输入相同的内容,我会得到相同的输出。但输出并不相同。这是正常的吗?如果你们对此有什么想法,请告诉我。
提前感谢 :)

vxqlmq5t

vxqlmq5t1#

为了获得相同的输出向量,你可以尝试使用相同的预训练模型和参数。在这个例子中,你可以使用BERT模型。以下是使用Hugging Face的transformers库加载预训练的BERT模型并生成相同句子的输出向量的示例代码:

from transformers import BertTokenizer, BertModel
import torch

# 加载预训练的BERT模型和分词器

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

# 输入句子

sentence = "hello world"

# 对句子进行分词并转换为Tensor

input_ids = tokenizer.encode(sentence, return_tensors='pt')

# 获取模型的输出

with torch.no_grad():
    outputs = model(input_ids)

# 提取输出向量的第一个元素(CLS标记的输出)

output_vector = outputs[0][0, 0, :].numpy()

print("输出向量:", output_vector)

这段代码将使用预训练的BERT模型('bert-base-uncased')对输入句子进行编码,并提取CLS标记的输出作为输出向量。这样,即使输入相同的句子,输出向量也会保持一致。

csga3l58

csga3l582#

你好,我正在适应这段代码,你能告诉我你是如何进行修改的吗?我对编程并不熟悉,但我需要完成这个任务。

zf2sa74q

zf2sa74q3#

我也有同样的问题。同样的输入,但每次都有不同的输出。我很困惑。你解决了吗?还是这是正常的?

brccelvz

brccelvz4#

@hairzooc,这是由于丢弃引起的。

bhmjp9jg

bhmjp9jg5#

@arcral是正确的,您必须在评估模式下将dropout设置为零:bert_model.eval()或者您可以通过在每一层手动设置dropout属性来实现。

xqk2d5yq

xqk2d5yq6#

我发现这是由于do_lower_case = True引起的。对于多语言模型,这个选项应该是False。感谢您的帮助:)

相关问题