В настоящее время я пытаюсь расширить модель , основанную на FairSeq / PyTorch. Во время обучения мне нужно обучить два кодера: один с целевой выборкой и исходный с исходной выборкой.
Таким образом, текущая функция пересылки выглядит следующим образом:
def forward(self, src_tokens=None, src_lengths=None, prev_output_tokens=None, **kwargs):
encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs)
decoder_out = self.decoder(prev_output_tokens, encoder_out=encoder_out, **kwargs)
return decoder_out
И на основена этой этой идее я хочу что-то вроде этого:
def forward_test(self, src_tokens=None, src_lengths=None, prev_output_tokens=None, **kwargs):
encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs)
decoder_out = self.decoder(prev_output_tokens, encoder_out=encoder_out, **kwargs)
return decoder_out
def forward_train(self, src_tokens=None, src_lengths=None, prev_output_tokens=None, **kwargs):
encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs)
autoencoder_out = self.encoder(tgt_tokens, src_lengths=src_lengths, **kwargs)
concat = some_concatination_func(encoder_out, autoencoder_out)
decoder_out = self.decoder(prev_output_tokens, encoder_out=concat, **kwargs)
return decoder_out
Есть ли способ сделать это?
Редактировать: это ограничения, которые у меня есть, поскольку мне нужно расширить FairseqEncoderDecoderModel :
@register_model('transformer_mass')
class TransformerMASSModel(FairseqEncoderDecoderModel):
def __init__(self, encoder, decoder):
super().__init__(encoder, decoder)
Редактировать 2: параметры, переданные функции пересылки в Fairseqможет быть изменен путем реализации вашего собственного критерия, см., например, CrossEntropyCriterion , где sample['net_input']
передается функции __call__
модели, которая вызывает метод forward
.