与韩语一起使用多语言巴特音调,以生成一些文本。 在尝试将数据传递到模型中时,我无法理解为什么模型的输出形状与预期的不同。
设置:我使用了MBartTokenizer和BartForConditionalGeneration
对于批处理,我使用prepare_translation_batch将数据作为批处理,inputs_ids和target_ids进行处理。 我还需要解码器输入ID(形式如[tgt_lang_code,seqence,eos]),所以我做到了。
这是问题所在。 BartForConditionalGeneration的前向传递必然需要input_id。从Bart的文档中,如果我仅将'input_ids'传递给模型(它可以包含注意_mask),则模型的解码器将没有其自己的输入,因此它将'input_ids'作为其输入。 返回中的prediction_scores的形状应为(batch_size,seq_len,vocab_size)并且正确运行
但是,当我将“ input_ids”和“ decoder_input_ids”一起传递给模型时,prediction_scores的形状始终显示(batch_size,1,vocab_size)。
我认为当我将输入一起传递时,返回中的prediction_scores形状应类似于(batch_size,decoder_input_seq_len,vocab_size) 我尝试使用普通的BartModel,它也显示了与BartForConditionalGeneration相同的形状。[在此处输入图片描述] [1]
我不知道为什么会这样。也许我完全误解了该模型。 我提出此主题的原因是我需要对此问题有个清晰的了解。 任何意见,将不胜感激。 谢谢。
from transformers import MBartTokenizer
from transformers import BartForConditionalGeneration
def make_decoder_input_ids(target_ids, lang_code):
target_ids_list = target_ids.tolist()
for idx,target in enumerate(target_ids_list):
del target[target.index(lang_code)]
target.insert(0,lang_code)
return torch.LongTensor(target_ids_list)
eng_code = tokenizer.cur_lang_code
eng_input = ["hello! my name is kim","so happy now!"]
eng_target = ["hello kim, nice to meet you","me too man haha!"]
eng :dict=tokenizer.prepare_translation_batch(eng_input,
src_lang="en_XX", tgt_lang="en_XX",tgt_texts=eng_target,
max_length = 16)
eng_input_ids = eng['input_ids']
eng_target_ids = eng['decoder_input_ids']
eng_attention_input = eng['attention_mask']
eng_decoder_attention_mask = eng['decoder_attention_mask']
eng_decoder_ids = make_decoder_input_ids(eng_target_ids,eng_code)
model = BartForConditionalGeneration.from_pretrained('facebook/mbart-large-en-ro')
#returns with input_ids and decoder_input_ids
eng_out = model(input_ids = eng_input_ids, decoder_input_ids =
eng_decoder_ids)
# returns with only input_ids
eng_out2 = model(input_ids = eng_input_ids)
eng_out[0].shape, eng_out2[0].shape
#it showed like
#(torch.Size([2, 1, 250027]), torch.Size([2, 16, 250027]))