目录
- 重新考察CNN
- 重新考察RNN
- 编码器-解码器架构
- 总结
- 编码器=解码器架构
- 编码器
- 解码器
- 合并编码器和解码器
重新考察CNN
编码器:将输入编码成中间表达形式(特征)
解码器:将中间表示解码成输出。
重新考察RNN
编码器:将文本表示成向量
解码器:向量表示成输出。
编码器-解码器架构
一个模块被分为两块:
编码器处理输出
解码器生成输出
总结
使用编码器-解码器架构的模型,编码器负责表示输入,解码器负责输出。
编码器=解码器架构
编码器
# 编码器
from torch import nnclass Encoder(nn.Module):"""编码器-解码器结构的基本编码器接口"""# Encoder 类的构造函数,它接受任意数量的关键字参数def __init__(self, **kwargs):# 调用了父类 nn.Module 的构造函数,确保正确初始化super(Encoder, self).__init__(**kwargs)# 给一个X,输出其状态def forward(self, X, *args):# 抛出一个 NotImplementedError 异常,表示该方法需要在子类中进行实现。raise NotImplementedError
解码器
# 解码器
class Decoder(nn.Module):def __init__(self, **kwargs):super(Decoder, self).__init__(**kwargs)# 有一个中介状态,编码器的东西传给解码器,拿到编码器的输出enc_outputs,然后初始化状态。def init_state(self, enc_outputs, *args):raise NotImplementedError# 拿到额外的输出X, state是用来不断更新的def forward(self, X, state):raise NotImplementedError
合并编码器和解码器
# 编码器
from torch import nn# 合并编码器和解码器
class EncoderDecoder(nn.Module):"""编码器-解码器结构的基类"""def __init__(self, encoder, decoder, **kwargs):super(EncoderDecoder, self).__init__(**kwargs)self.encoder = encoderself.decoder = decoderdef 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)