第一步,在python中导入我们需要使用用到的库
import math
> import torch
> import torch.nn as nn
> import torch.nn.functional as F
> import torch.optim as optim
其中math库是python中包含数学运算的库,而torch是python中深度学习框架
今天的目标是将我们输入的序列转化为位置编码
class PositionalEncoding(nn.Module):
def __init__(self, d_model, max_len=5000):
super(PositionalEncoding, self).__init__()
#计算位置编码
pe=torch.zeros(max_len,d_model)
#生成了一个输入特征维度和最大序列长度的张量
position=torch.arange(0,max_len,dtype=torch.float).unsqueeze(1)
#生成了一个二维张量,第一维度是从0到max_len-1,第二维度是1
# 第三步,实现positional Ecoding数学代码公式的编码,具体公式看看主页文章
div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-torch.log(
torch.tensor(10000.0)) / d_model))
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
pe = pe.unsqueeze(0)
#也就是以现在的pe最外围包了一层,变成一个batch_size为1的张量
self.register_buffer('pe', pe)
def forward(self,x):
x=x+self.pe[:,:x.size(1)]
print("x.size(1)",x.size(1))
return x
d_model = 512
max_len = 100
num_heads = 8
pos_encoder = PositionalEncoding(d_model, max_len)
# 示例输入序列
input_sequence = torch.randn(5, max_len, d_model)
# print("输入序列:" + str(input_sequence))
# 应用位置编码
input_sequence = pos_encoder(input_sequence)
print("输入序列的位置编码:")
print(input_sequence.shape)
知识点:
- 知识点一:nn.Module,是 PyTorch 中用于构建神经网络的基类。
- 知识点二:d_model: 这个参数表示输入特征的维度。通常在变换器(Transformer)模型中,这个维度是固定- 的,用于定义输入和输出的向量大小。
- 知识点三:max_len: 这个参数表示最大序列长度。在变换器(Transformer)模型中,这个参数用于计算位置编码
- 知识点四:具体来说,unsqueeze(0) 会在 pe 张量的第一个维度(索引为 0 的维度)插入一个新的维度,通常用于在数据处理时增加一个批次维度。
- 知识点五:unsqueeze(1) 会在张量的第二个维度插入一个新的维度。
- 知识点六:register_buffer('pe', pe) 会将 pe 注册为模型的缓冲区,这样它就会被保存到模型的 state_dict 中,但不会被优化器优化
- 知识点七:x.size(1) 返回张量 x 在第 1 维的大小(通常是序列的长度或特征数)。这个大小决定了你从位置编码 self.pe 中提取的部分。
- 知识点八:5:表示批次大小(batch size),即生成 5 个样本。
- max_len:表示每个样本的序列长度,即每个样本包含 max_len 个时间步(或元素)。
d_model:表示每个时间步的特征维度,通常是模型中输入特征的维度大小。