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