Transformer pytorch 代码解读(1)词编码 + 位置编码

从Encoder的整体来看,红色部分是词编码,黄色部分是位置编码,绿色部分是encoder计算层。红色和黄色部分只进行一次,而对于绿色部分经过for循环列表会执行多次,也就是下图中的N。

本文接下来将对红色和黄色的部分进行分析:

 

整体结构如图:

1.词编码 

 

nn.Embedding需要目标词库的长度,以及想要转换的维度。在实例化的forward使用中,输入的enc_inputs的维度是(2,6)也就是(batch_size,src_len)。也就是

[[1, 2, 3, 4, 0], [1, 2, 3, 5, 0]],代表着最原始的字母->编码。

在经过实例化的词编码后,编码的维度->(2,5,512)

 

 2.位置编码

forward这里传入的是上一层词编码的输出,也就是(2,5,512)的维度,(batch_size,src_len,编码的输出维度[自己定义的维度]),但是进行了transpose,所以他的输入是(5,2,512)的维度。经过位置编码的维度是不变的,只不过给其加上了位置的信息。

总结:

在进入多头注意力的计算之前,原始数据从(2,5)->(2,5,512)->(2,5,512),经过了两次变换,第一次是进行词编码,第二次虽然维度没有变换但是增加了位置的信息。

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Transformer 模型是一种深度学习模型,用于处理序列数据,如自然语言处理任务中的文本分类、机器翻译等。下面是一个简单的 TransformerPyTorch 代码解读: ```python import torch import torch.nn as nn import torch.nn.functional as F class Transformer(nn.Module): def __init__(self, input_dim, hidden_dim, num_classes): super(Transformer, self).__init__() self.embedding = nn.Embedding(input_dim, hidden_dim) self.encoder_layer = nn.TransformerEncoderLayer(hidden_dim, nhead=4) self.transformer_encoder = nn.TransformerEncoder(self.encoder_layer, num_layers=2) self.fc = nn.Linear(hidden_dim, num_classes) def forward(self, x): x = self.embedding(x) x = x.permute(1, 0, 2) # 调整输入形状 x = self.transformer_encoder(x) x = x.permute(1, 0, 2) # 调整输出形状 x = x.mean(dim=1) # 平均池化 x = self.fc(x) return F.log_softmax(x, dim=1) ``` 这段代码定义了一个简单的 Transformer 模型,含了嵌入层、Transformer 编码器层和全连接层。 在构造函数 `__init__` 中,首先创建了一个嵌入层 `embedding`,用于将输入数据进行向量化表示。`input_dim` 是输入数据中的汇表大小,`hidden_dim` 是每个向量的维度。 接着创建了一个 Transformer 编码器层 `encoder_layer`,并使用它初始化了 `transformer_encoder`。`hidden_dim` 表示编码器的输入和输出的维度,`nhead` 表示多头注意力机制的头数。 最后,创建了一个全连接层 `fc`,将 Transformer 编码器的输出映射到目标类别数量 `num_classes`。 在前向传播函数 `forward` 中,输入数据先经过嵌入层进行向量化,然后调整形状。接着通过 Transformer 编码器层进行特征提取和表示学习,再次调整形状。然后通过平均池化操作对时间维度进行降维,最后通过全连接层得到预测结果,并使用 log_softmax 进行归一化。 这是一个简单的 Transformer 模型的代码解读,更复杂的模型可以通过增加编码器层和解码器层来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值