编码器-解码器

Note

机器翻译要将一个序列转换成另一个序列,其输入和输出都是长度可变的序列。为了处理这种类型的输入和输出,我们可以设计一个包含两个组件的结构。
第一个组件是编码器(Encoder):它接受长度可变的序列作为输入,将其转化为固定形状的编码。
第二个组件是解码器(Decoder):它将固定形状的编码映射到长度可变的序列。

jupyter

编码器

from torch import nn


#@save
class Encoder(nn.Module):
    """编码器的基类"""
    def __init__(self, **kwargs):
        super(Encoder, self).__init__(**kwargs)

    def forward(self, X, *args):
        raise NotImplementedError

解码器

#@save
class Decoder(nn.Module):
    """解码器的基类"""
    def __init__(self, **kwargs):
        super(Decoder, self).__init__(**kwargs)

    def init_state(self, enc_outputs, *args):
        raise NotImplementedError

    def forward(self, X, state):
        raise NotImplementedError

编码器-解码器

#@save
class EncoderDecoder(nn.Module):
    """编码器-解码器结构的基类"""
    def __init__(self, encoder, decoder, **kwargs):
        super(EncoderDecoder, self).__init__(**kwargs)
        self.encoder = encoder
        self.decoder = decoder

    def forward(self, enc_X, dec_X, *args):
        enc_outputs = self.encoder(enc_X, *args)
        dec_state = self.decoder.init_state(enc_outputs, *args)
        return self.decoder(dec_X, dec_state)