我试图使用bert large uncased作为长序列结束,但它给出了错误:
代码:
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-large-uncased')
model = BertModel.from_pretrained("bert-large-uncased")
text = "Replace me by any text you'd like."*1024
encoded_input = tokenizer(text, truncation=True, max_length=1024, return_tensors='pt')
output = model(**encoded_input)
它给出了以下错误:
~/.local/lib/python3.6/site-packages/transformers/models/bert/modeling_bert.py in forward(self, input_ids, token_type_ids, position_ids, inputs_embeds, past_key_values_length)
218 if self.position_embedding_type == "absolute":
219 position_embeddings = self.position_embeddings(position_ids)
--> 220 embeddings += position_embeddings
221 embeddings = self.LayerNorm(embeddings)
222 embeddings = self.dropout(embeddings)
RuntimeError: The size of tensor a (1024) must match the size of tensor b (512) at non-singleton dimension 1
我还尝试更改位置嵌入的默认大小:
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-large-uncased')
model = BertModel.from_pretrained("bert-large-uncased")
model.config.max_position_embeddings = 1024
text = "Replace me by any text you'd like."*1024
encoded_input = tokenizer(text, truncation=True, max_length=1024, return_tensors='pt')
output = model(**encoded_input)
但错误仍然存在,如何对1024长度的序列使用大模型?
我可能错了,但我想你已经在这里找到了答案:如何使用Bert进行长文本分类?
基本上,你需要对你的文本进行某种截断,或者你需要把它分块处理,然后把它们粘在一起。
旁注:由于序列长度的原因,大型模型不称为大型。最大序列长度仍然是512个令牌。(来自令牌生成器的令牌,而不是句子中的单词(
编辑:
您想要使用的预训练模型在最多512个令牌上进行训练。当您从huggingface下载它时,您可以在配置中看到max_position_embeddings
,即512。这意味着你不能真的对此进行扩展。(事实并非如此(
但是,您可以随时调整您的配置。
tokenizer = BertTokenizer.from_pretrained('bert-large-uncased')
model = BertModel.from_pretrained(
'bert-large-uncased',
max_position_embeddings=1024,
ignore_mismatched_sizes=True
)
注意,这是非常不明智的,因为它会破坏你预先训练的模型。也许它会变成红色,行星开始碰撞,或者猪开始从天空中掉下来。没有人真的能说出来。使用它的风险自负。