嘿,伙计们,我已经用相同的输入文本测试了extract_features.py,发现它每次返回的层值都不同。(来自源代码:layer_value = [round(float(x), 6) for x in layer_output[i:(i + 1)].flat])我只是希望如果我输入相同的内容,我会得到相同的输出。但输出并不相同。这是正常的吗?如果你们对此有什么想法,请告诉我。提前感谢 :)
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标记的输出作为输出向量。这样,即使输入相同的句子,输出向量也会保持一致。
csga3l582#
你好,我正在适应这段代码,你能告诉我你是如何进行修改的吗?我对编程并不熟悉,但我需要完成这个任务。
zf2sa74q3#
我也有同样的问题。同样的输入,但每次都有不同的输出。我很困惑。你解决了吗?还是这是正常的?
brccelvz4#
@hairzooc,这是由于丢弃引起的。
bhmjp9jg5#
@arcral是正确的,您必须在评估模式下将dropout设置为零:bert_model.eval()或者您可以通过在每一层手动设置dropout属性来实现。
xqk2d5yq6#
我发现这是由于do_lower_case = True引起的。对于多语言模型,这个选项应该是False。感谢您的帮助:)
6条答案
按热度按时间vxqlmq5t1#
为了获得相同的输出向量,你可以尝试使用相同的预训练模型和参数。在这个例子中,你可以使用BERT模型。以下是使用Hugging Face的transformers库加载预训练的BERT模型并生成相同句子的输出向量的示例代码:
这段代码将使用预训练的BERT模型('bert-base-uncased')对输入句子进行编码,并提取CLS标记的输出作为输出向量。这样,即使输入相同的句子,输出向量也会保持一致。
csga3l582#
你好,我正在适应这段代码,你能告诉我你是如何进行修改的吗?我对编程并不熟悉,但我需要完成这个任务。
zf2sa74q3#
我也有同样的问题。同样的输入,但每次都有不同的输出。我很困惑。你解决了吗?还是这是正常的?
brccelvz4#
@hairzooc,这是由于丢弃引起的。
bhmjp9jg5#
@arcral是正确的,您必须在评估模式下将dropout设置为零:bert_model.eval()或者您可以通过在每一层手动设置dropout属性来实现。
xqk2d5yq6#
我发现这是由于do_lower_case = True引起的。对于多语言模型,这个选项应该是False。感谢您的帮助:)