(Huggingface变形金刚)BartModel的输出形状问题

时间:2020-07-19 10:04:11

标签: nlp transformer huggingface-transformers huggingface-tokenizers

与韩语一起使用多语言巴特音调,以生成一些文本。 在尝试将数据传递到模型中时,我无法理解为什么模型的输出形状与预期的不同。

设置:我使用了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]))

0 个答案:

没有答案