(Huggingface Transformers) Вопрос для формы вывода BartModel

Настроить многоязычный Барт с корейским для создания некоторых текстов. пока я пытался передать свои данные в модель, я не могу понять, почему выходная форма модели отличается от того, что я ожидал.

Настройки: я использовал MBartTokenizer и BartForConditionalGeneration

для пакета я использовал prepare_translation_batch, чтобы сделать данные как пакет, inputs_ids и target_ids. Мне также нужны decoder_input_ids(форма вроде [tgt_lang_code, seqence, eos]), поэтому я сделал это.

Вот в чем проблема. Прямой проход BartForConditionalGeneration обязательно требует input_ids. Из документов Барта: если я передаю модели только '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 ответов

Другие вопросы по тегам