问题标签 [huggingface-transformers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 从 `pytorch-pretrained-bert` 迁移到 `pytorch-transformers` 关于模型()输出的问题
我无法将我的代码pytorch_pretrained_bert
从pytorch_transformers
. 我正在尝试进行余弦相似度练习。我想提取 12 个隐藏嵌入层中倒数第二个的文本嵌入值。
使用 pytorch_pretrained_bert 与上述代码完美配合。我的encoded_layers
对象是 12 个隐藏层张量的列表,允许我通过取平均值来选择和减少第 11 层,从而得到sentence_embedding
可以运行余弦相似度的对象。
但是,当我将代码迁移到pytorch_transformers
库时,生成的encoded_layers
对象不再是 12 个隐藏层的完整列表,而是一个 shape 的火炬张量对象torch.Size([1, 7, 768])
,这在我尝试创建sentence_embedding
对象时导致以下错误:
迁移文档 ( https://huggingface.co/transformers/migration.html ) 指出我应该将encoded_layers
对象的第一个元素作为替换,但这并不能让我访问嵌入的倒数第二个隐藏层。
我怎样才能访问它?
谢谢!
keras - 从 BERT 分类器中删除最后 2 层会导致“'tuple' object has no attribute 'dim'”错误。为什么?
我使用 Keras(使用 ktrain)微调了一个拥抱脸转换器,然后在 Pytorch 中重新加载了模型。
我想访问倒数第三层(pre_classifier
),所以我删除了最后两层:
通过它运行一个编码的句子会产生以下错误消息:
同时完全删除分类器(所有三层)
产生具有预期形状 ( ) 的预期张量(在大小 1 元组内[sentence_num,token_num,768]
)。
为什么移除两层(而不是三层)会破坏模型?以及如何访问pre_classifier
结果?
无法通过设置访问它config
,output_hidden_states=True
因为此标志返回 BERT 转换器堆栈的隐藏值,而不是其下游分类器层的隐藏值。
--
附言
用于初始化 BERT 模型的代码:
transformer - 如果 BERT 的 [CLS] 可以针对各种句子分类目标进行再训练,那么 [SEP] 呢?
在 BERT 预训练中,[CLS] 标记嵌入到分类器的输入中,该分类器的任务是下一个句子预测任务(或者,在某些 BERT 变体中,还有其他任务,例如 ALBERT 的句子顺序预测);这有助于对整个转换器进行预训练,并且还有助于使 [CLS] 位置随时可用于对其他“句子量表”任务进行再训练。
我想知道 [SEP] 是否也可以以同样的方式进行再培训。虽然 [CLS] 可能更容易重新训练,因为 Transformer 已经被训练为在整个句子中赋予其嵌入意义,而 [SEP] 没有这些“连接”(人们会假设),这可能仍然适用于足够的微调。
有了这个,可以为两种不同的分类任务重新训练相同的模型,一种使用 [CLS],另一种使用 [SEP]。
我错过了什么吗?有没有理由为什么这不起作用?
huggingface-transformers - 在 lm 微调中前向传递期间使用 attention_mask
我对 Hugging Face 存储库上的语言模型微调代码有疑问。BERT 模型的 forward 方法似乎将一个名为attention_mask的参数作为输入。
文档说注意掩码是在将序列批处理在一起时使用的可选参数。该参数向模型指示应该注意哪些标记,哪些不应该注意。例如,tokenizer 编码方法返回这个注意掩码,一个二进制张量,指示填充索引的位置,以便模型不注意它们,这是有道理的。
但是,如果我没记错的话,我在语言模型微调的代码中看不到这个注意掩码的用法。实际上,在前向传递期间,只有输入 id 作为输入给出,参见此代码。
我的问题是:这是否意味着我们不会在训练期间消除对填充标记的关注?将它们考虑在内是否有意义?或者也许我错过了代码中的某些内容?
非常感谢您的回答 :)
编辑
我注意到 Hugging Face 构建数据集的方式根本不需要填充(请参阅此代码)
python - 对 gpt2 同时使用 past 和 attention_mask
我正在处理一批不同长度的句子,因此我计划利用 gpt2 中的 padding + attention_mask 功能来实现这一点。
同时,对于每个句子我需要添加一个后缀短语并运行 N 个不同的推理。例如,给定句子“我喜欢喝可乐”,我可能需要运行两个不同的推论:“我喜欢喝可乐。可乐很好”和“我喜欢喝可乐。喝很好”。因此,我试图通过使用“过去”功能来改善推理时间:https ://huggingface.co/transformers/quickstart.html#using-the-past所以我只处理原始句子(例如“我like to drink coke") 一次,然后我以某种方式扩展结果以便能够与另外两个句子一起使用:“Coke is good”和“Drink is good”。
下面你会找到一个简单的代码,它试图代表我是如何尝试这样做的。为简单起见,我只是为每个句子添加一个后缀短语(......但我仍然希望我最初的想法是可能的):
我得到的错误如下:
最初我认为这与https://github.com/huggingface/transformers/issues/3031有关- 所以我重新构建了最新的 master 来尝试修复,但我仍然遇到这个问题。
nlp - 使用自定义 X 和 Y 数据训练 TFBertForSequenceClassification
我正在研究一个 TextClassification 问题,为此我正在尝试在 Huggingface-transformers 库中给出的 TFBertForSequenceClassification 上训练我的模型。
我按照他们的github页面上给出的示例进行操作,我可以使用给定的示例数据运行示例代码tensorflow_datasets.load('glue/mrpc')
。但是,我找不到有关如何加载我自己的自定义数据并将其传入的示例
model.fit(train_dataset, epochs=2, steps_per_epoch=115, validation_data=valid_dataset, validation_steps=7)
。
如何定义我自己的 X,对我的 X 进行标记化并使用我的 X 和 Y 准备 train_dataset。其中 X 代表我的输入文本,Y 代表给定 X 的分类类别。
样本训练数据框:
python - 如何使用来自 BERT 的嵌入来比较句子相似度
我正在使用 HuggingFace Transformers 包来访问预训练模型。由于我的用例需要英语和阿拉伯语的功能,我使用的是bert-base-multilingual- cased 预训练模型。我需要能够使用诸如余弦相似度之类的东西来比较句子的相似度。要使用它,我首先需要为每个句子获取一个嵌入向量,然后可以计算余弦相似度。
首先,从 BERT 模型中提取语义嵌入的最佳方法是什么?在输入句子后获取模型的最后一个隐藏状态就足够了吗?
其次,如果这是从我的句子中获取嵌入的充分方法,那么我现在遇到另一个问题,即嵌入向量的长度取决于原始句子的长度。输出的形状是[1, n, vocab_size]
,其中n
可以有任何值。
为了计算两个向量的余弦相似度,它们需要具有相同的长度。我怎么能在这里做到这一点?像第一次求和这样幼稚的事情axis=1
还能奏效吗?我还有什么其他选择?
python-3.x - 如何使用Huggingface T5模型测试翻译任务?
我看到存在 T5model 的两个配置 - T5Model和TFT5WithLMHeadModel。我想测试这个翻译任务(例如en-de),因为它们在谷歌的原始仓库中显示。有没有办法可以使用这个模型从拥抱脸来测试翻译任务。我在文档方面没有看到任何与此相关的示例,并且想知道如何提供输入并获得结果。
任何帮助表示赞赏
python - RoBERTa 的 GilBERTo(意大利语版)
我尝试使用 GilBERTo(tokenizer 和模型)和 RoBERTa 的意大利语版本(来自 CamemBert)训练 NER 模型,但我有以下错误,有人可以帮助我理解它,也许是一个可能的解决方案?
该解决方案复制了:GitHub:R-BERT 实体关系 (我只是将 utils.py 更改为:
) 然后我在 main.py 中使用模型“roberta”,只需将 Tokenizer 更改为 GilBERTo。我使用了与原始项目相同格式的不同数据集。注意:由于缓存上传的大小问题,我禁用了 GPU,并且我使用了变形金刚 2.4.1,非常感谢!