0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PyTorch教程-10.6. 编码器-解码器架构

jf_pJlTbmA9 来源:PyTorch 作者:PyTorch 2023-06-05 15:44 次阅读

在一般的 seq2seq 问题中,如机器翻译(第 10.5 节),输入和输出的长度不同且未对齐。处理这类数据的标准方法是设计一个编码器-解码器架构(图 10.6.1),它由两个主要组件组成:一个 编码器,它以可变长度序列作为输入,以及一个 解码器,作为一个条件语言模型,接收编码输入和目标序列的向左上下文,并预测目标序列中的后续标记。

poYBAGR9N3SADJcWAACS_jUPoZI623.svg

图 10.6.1编码器-解码器架构。

让我们以从英语到法语的机器翻译为例。给定一个英文输入序列:“They”、“are”、“watching”、“.”,这种编码器-解码器架构首先将可变长度输入编码为一个状态,然后对该状态进行解码以生成翻译后的序列,token通过标记,作为输出:“Ils”、“regardent”、“.”。由于编码器-解码器架构构成了后续章节中不同 seq2seq 模型的基础,因此本节将此架构转换为稍后将实现的接口

from torch import nn
from d2l import torch as d2l

from mxnet.gluon import nn
from d2l import mxnet as d2l

from flax import linen as nn
from d2l import jax as d2l

No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)

import tensorflow as tf
from d2l import tensorflow as d2l

10.6.1。编码器

在编码器接口中,我们只是指定编码器将可变长度序列作为输入X。实现将由继承此基类的任何模型提供Encoder。

class Encoder(nn.Module): #@save
  """The base encoder interface for the encoder-decoder architecture."""
  def __init__(self):
    super().__init__()

  # Later there can be additional arguments (e.g., length excluding padding)
  def forward(self, X, *args):
    raise NotImplementedError

class Encoder(nn.Block): #@save
  """The base encoder interface for the encoder-decoder architecture."""
  def __init__(self):
    super().__init__()

  # Later there can be additional arguments (e.g., length excluding padding)
  def forward(self, X, *args):
    raise NotImplementedError

class Encoder(nn.Module): #@save
  """The base encoder interface for the encoder-decoder architecture."""
  def setup(self):
    raise NotImplementedError

  # Later there can be additional arguments (e.g., length excluding padding)
  def __call__(self, X, *args):
    raise NotImplementedError

class Encoder(tf.keras.layers.Layer): #@save
  """The base encoder interface for the encoder-decoder architecture."""
  def __init__(self):
    super().__init__()

  # Later there can be additional arguments (e.g., length excluding padding)
  def call(self, X, *args):
    raise NotImplementedError

10.6.2。解码器

在下面的解码器接口中,我们添加了一个额外的init_state 方法来将编码器输出 ( enc_all_outputs) 转换为编码状态。请注意,此步骤可能需要额外的输入,例如输入的有效长度,这在 第 10.5 节中有解释。为了逐个令牌生成可变长度序列令牌,每次解码器都可以将输入(例如,在先前时间步生成的令牌)和编码状态映射到当前时间步的输出令牌。

class Decoder(nn.Module): #@save
  """The base decoder interface for the encoder-decoder architecture."""
  def __init__(self):
    super().__init__()

  # Later there can be additional arguments (e.g., length excluding padding)
  def init_state(self, enc_all_outputs, *args):
    raise NotImplementedError

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

class Decoder(nn.Block): #@save
  """The base decoder interface for the encoder-decoder architecture."""
  def __init__(self):
    super().__init__()

  # Later there can be additional arguments (e.g., length excluding padding)
  def init_state(self, enc_all_outputs, *args):
    raise NotImplementedError

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

class Decoder(nn.Module): #@save
  """The base decoder interface for the encoder-decoder architecture."""
  def setup(self):
    raise NotImplementedError

  # Later there can be additional arguments (e.g., length excluding padding)
  def init_state(self, enc_all_outputs, *args):
    raise NotImplementedError

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

class Decoder(tf.keras.layers.Layer): #@save
  """The base decoder interface for the encoder-decoder architecture."""
  def __init__(self):
    super().__init__()

  # Later there can be additional arguments (e.g., length excluding padding)
  def init_state(self, enc_all_outputs, *args):
    raise NotImplementedError

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

10.6.3。将编码器和解码器放在一起

在前向传播中,编码器的输出用于产生编码状态,解码器将进一步使用该状态作为其输入之一。

class EncoderDecoder(d2l.Classifier): #@save
  """The base class for the encoder-decoder architecture."""
  def __init__(self, encoder, decoder):
    super().__init__()
    self.encoder = encoder
    self.decoder = decoder

  def forward(self, enc_X, dec_X, *args):
    enc_all_outputs = self.encoder(enc_X, *args)
    dec_state = self.decoder.init_state(enc_all_outputs, *args)
    # Return decoder output only
    return self.decoder(dec_X, dec_state)[0]

class EncoderDecoder(d2l.Classifier): #@save
  """The base class for the encoder-decoder architecture."""
  def __init__(self, encoder, decoder):
    super().__init__()
    self.encoder = encoder
    self.decoder = decoder

  def forward(self, enc_X, dec_X, *args):
    enc_all_outputs = self.encoder(enc_X, *args)
    dec_state = self.decoder.init_state(enc_all_outputs, *args)
    # Return decoder output only
    return self.decoder(dec_X, dec_state)[0]

class EncoderDecoder(d2l.Classifier): #@save
  """The base class for the encoder-decoder architecture."""
  encoder: nn.Module
  decoder: nn.Module
  training: bool

  def __call__(self, enc_X, dec_X, *args):
    enc_all_outputs = self.encoder(enc_X, *args, training=self.training)
    dec_state = self.decoder.init_state(enc_all_outputs, *args)
    # Return decoder output only
    return self.decoder(dec_X, dec_state, training=self.training)[0]

class EncoderDecoder(d2l.Classifier): #@save
  """The base class for the encoder-decoder architecture."""
  def __init__(self, encoder, decoder):
    super().__init__()
    self.encoder = encoder
    self.decoder = decoder

  def call(self, enc_X, dec_X, *args):
    enc_all_outputs = self.encoder(enc_X, *args, training=True)
    dec_state = self.decoder.init_state(enc_all_outputs, *args)
    # Return decoder output only
    return self.decoder(dec_X, dec_state, training=True)[0]

在下一节中,我们将看到如何应用 RNN 来设计基于这种编码器-解码器架构的 seq2seq 模型。

10.6.4。概括

编码器-解码器架构可以处理由可变长度序列组成的输入和输出,因此适用于机器翻译等 seq2seq 问题。编码器将可变长度序列作为输入,并将其转换为具有固定形状的状态。解码器将固定形状的编码状态映射到可变长度序列。

10.6.5。练习

假设我们使用神经网络来实现编码器-解码器架构。编码器和解码器必须是同一类型的神经网络吗?

除了机器翻译,你能想到另一个可以应用编码器-解码器架构的应用程序吗?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 解码器
    +关注

    关注

    9

    文章

    1073

    浏览量

    40165
  • 编码器
    +关注

    关注

    41

    文章

    3364

    浏览量

    131561
  • pytorch
    +关注

    关注

    2

    文章

    763

    浏览量

    12836
收藏 人收藏

    评论

    相关推荐

    如何使用PSoC Creator中的块构建NRZI解码器编码器

    您好!如何使用PSoC Creator中的块构建NRZI解码器编码器。当做
    发表于 09-10 09:26

    怎么理解真正的编码器解码器

      在进入关于编码器解码器的现实之前,让我们对复用进行简要的思考。通常我们会在需要将一些输入信号一次一个地加载到一个单独负载的应用程序中。选择输入信号中的一个输入信号的过程称为多路复用。这种操作
    发表于 09-01 17:48

    在TMS320C6657器件上轻松运行经TI 优化的Opus编码器/解码器

    描述 TIDEP0036 参考设计演示了如何在 TMS320C6657 器件上轻松运行经 TI 优化的 Opus 编码器/解码器。由于 Opus 支持各类比特率、帧大小和采样率且均延迟极低,因而
    发表于 09-22 06:32

    编码器解码器的区别是什么,编码器用软件还是硬件好

    编码器指的是对视频信号进行压缩,解码器主要是将压缩的视频信号进行解压缩。目前做直播的很多都是采用的编码器,客户端可以采用解码器或软件播放器解码
    发表于 08-02 17:23 3.4w次阅读

    PyTorch教程10.6编码器-解码器架构

    电子发烧友网站提供《PyTorch教程10.6编码器-解码器架构.pdf》资料免费下载
    发表于 06-05 18:12 0次下载
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>10.6</b>之<b class='flag-5'>编码器</b>-<b class='flag-5'>解码器</b><b class='flag-5'>架构</b>

    PyTorch教程10.7之用于机器翻译的编码器-解码器Seq2Seq

    电子发烧友网站提供《PyTorch教程10.7之用于机器翻译的编码器-解码器Seq2Seq.pdf》资料免费下载
    发表于 06-05 18:14 0次下载
    <b class='flag-5'>PyTorch</b>教程10.7之用于机器翻译的<b class='flag-5'>编码器</b>-<b class='flag-5'>解码器</b>Seq2Seq

    PyTorch教程-10.7. 用于机器翻译的编码器-解码器 Seq2Seq

    序列组成,我们通常依赖编码器-解码器架构(第10.6 节)。在本节中,我们将演示编码器-解码器
    的头像 发表于 06-05 15:44 571次阅读
    <b class='flag-5'>PyTorch</b>教程-10.7. 用于机器翻译的<b class='flag-5'>编码器</b>-<b class='flag-5'>解码器</b> Seq2Seq

    基于transformer的编码器-解码器模型的工作原理

    与基于 RNN 的编码器-解码器模型类似,基于 transformer 的编码器-解码器模型由一个编码器和一个
    发表于 06-11 14:17 1323次阅读
    基于transformer的<b class='flag-5'>编码器</b>-<b class='flag-5'>解码器</b>模型的工作原理

    基于 RNN 的解码器架构如何建模

    language processing,NLP) 领域编码器-解码器架构的 事实标准 。 最近基于 transformer 的编码器-解码器
    的头像 发表于 06-12 17:08 470次阅读
    基于 RNN 的<b class='flag-5'>解码器</b><b class='flag-5'>架构</b>如何建模

    基于 Transformers 的编码器-解码器模型

    基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器
    的头像 发表于 06-16 16:53 512次阅读
    基于 Transformers 的<b class='flag-5'>编码器</b>-<b class='flag-5'>解码器</b>模型

    神经编码器-解码器模型的历史

    基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器
    的头像 发表于 06-20 15:42 476次阅读
    神经<b class='flag-5'>编码器</b>-<b class='flag-5'>解码器</b>模型的历史

    详解编码器解码器电路

    编码器解码器是组合逻辑电路,在其中,主要借助布尔代数实现组合逻辑。今天就大家了解一下编码器解码器电路,分别从定义,工作原理,应用,真值表几个方面讲述一下。
    的头像 发表于 07-14 09:07 1804次阅读
    详解<b class='flag-5'>编码器</b>和<b class='flag-5'>解码器</b>电路

    视频编码器解码器的应用方案

    视频解码器和视频编码器在数字通讯、音视频压缩领域有着广泛的应用。视频编码器作为视频源的发送端,若接收端如果是 PC 机或显示设备就需要通过解码器进行
    的头像 发表于 08-14 14:38 902次阅读
    视频<b class='flag-5'>编码器</b>与<b class='flag-5'>解码器</b>的应用方案

    YXC丨视频编码器解码器的应用方案

    视频解码器和视频编码器是数字信号处理中常用的设备,它们在数据的传输和转换中发挥着重要作用。
    的头像 发表于 08-23 09:40 411次阅读
    YXC丨视频<b class='flag-5'>编码器</b>与<b class='flag-5'>解码器</b>的应用方案

    视频编码器解码器的应用方案

    视频解码器和视频编码器是数字信号处理中常用的设备,它们在数据的传输和转换中发挥着重要作用。
    的头像 发表于 08-28 11:31 354次阅读
    视频<b class='flag-5'>编码器</b>与<b class='flag-5'>解码器</b>的应用方案