我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。|

乐池

园龄:3年4个月粉丝:0关注:7

Transformer电力负荷预测

1. 初始解释

1.1 参数

  • S:源序列长度,比如说我们有过去一周(7天)的电力负荷数据,那么 S 就是 7 天的数据点数目,每个数据点可能代表一个小时或者更短的时间间隔。
  • T:目标序列长度,假设我们想要预测未来一天(24小时)的电力负荷,那么 T 就是 24 个时间步,每个时间步代表一个小时。
  • N:批量大小,如果我们希望同时预测多个地区或者多个设备的电力负荷,那么 N 就是每个批次中的样本数量,每个样本可能对应一个地区或者一个设备的负荷数据。
  • E:特征数量,这是用于预测的特征数目。特征可以包括温度、湿度、季节性因素、假日等信息,以及历史负荷数据。
  • max_len
    在代码中规定 max_len=5000 的作用是为了限制位置编码的最大长度。位置编码是用来为序列中不同位置的元素提供独特的编码,以便模型能够区分不同位置的信息。在 Transformer 模型中,位置编码的长度通常需要与序列的长度相匹配。

但是,由于 Transformer 模型中的位置编码是固定的,并且是在模型训练之前就预先计算好的,因此需要事先确定一个合适的位置编码的最大长度。在这里,将 max_len 设置为 5000 的目的是为了限制位置编码的最大长度,以防止序列过长时导致计算资源的浪费。

通常情况下,max_len 的选择取决于具体任务和数据集的特点,需要根据序列的最大长度来进行合理的设定。

  • d_model
    在 Transformer 模型中,d_model 表示模型的隐藏层大小或者称为特征维度。在编码器和解码器的各个层中,输入和输出的维度都是 d_model。它是 Transformer 模型中的一个关键超参数,影响着模型的表示能力和学习效果。

具体来说,d_model 决定了模型对输入和输出的表达能力。较大的 d_model 可以提供更丰富的特征表示,增加模型的表达能力,但也可能增加模型的计算复杂度和训练参数量。相反,较小的 d_model 可以减少模型的计算负担,但可能会限制模型的表达能力。

在实践中,d_model 的选择通常需要根据具体的任务需求、数据集规模和计算资源等因素来进行调整。常见的选择包括 128、256、512 等不同的值,具体的选择需要结合实际情况进行评估和调整。

1.2 super(Net, self).init()

Python中的super(Net, self).init()是指首先找到Net的父类(比如是类NNet),然后把类Net的对象self转换为类NNet的对象,然后“被转换”的类NNet对象调用自己的init函数,其实简单理解就是子类把父类的__init__()放到自己的__init__()当中,这样子类就有了父类的__init__()的那些东西。

回过头来看看我们的我们最上面的代码,Net类继承nn.Module,super(Net, self).init()就是对继承自父类nn.Module的属性进行初始化。而且是用nn.Module的初始化方法来初始化继承的属性。

class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 输入图像channel:1;输出channel:6;5x5卷积核
self.conv1 = nn.Conv2d(1, 6, 5)

也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。
举个例子帮助大家理解:

class Person:
def __init__(self,name,gender):
self.name = name
self.gender = gender
def printinfo(self):
print(self.name,self.gender)
class Stu(Person):
def __init__(self,name,gender,school):
super(Stu, self).__init__(name,gender) # 使用父类的初始化方法来初始化子类
self.school = school
def printinfo(self): # 对父类的printinfo方法进行重写
print(self.name,self.gender,self.school)
if __name__ == '__main__':
stu = Stu('djk','man','nwnu')
stu.printinfo()

当然,如果初始化的逻辑与父类的不同,不使用父类的方法,自己重新初始化也是可以的。比如:

class Person(object):
def __init__(self,name,gender,age):
self.name = name
self.gender = gender
self.age = age
class Student(Person):
def __init__(self,name,gender,age,school,score):
#super(Student,self).__init__(name,gender,age)
self.name = name.upper()
self.gender = gender.upper()
self.school = school
self.score = score
s = Student('Alice','female',18,'Middle school',87)
print s.school
print s.name

1.3 切片回顾

  • pe[:, 0::2] 是 Python 中的切片操作,它用于从张量 pe 中选择特定的部分。

具体地说,: 表示选择整个维度,0::2 表示从索引 0 开始,以步长 2 选择元素。因此,pe[:, 0::2] 表示选择张量 pe 中所有行,并且从第一列开始,以步长 2 选择所有偶数索引的列。

在这个位置编码的代码中,pe[:, 0::2] 用于选择位置编码张量 pe 中的所有行,并且选择其中的偶数位置上的编码,用于存储余弦函数计算得到的位置编码值。

  • pe[:x.size(0), :] 是一个在 PyTorch 中常见的索引操作,用于从张量 pe 中选择特定的部分。

具体地说,: 表示选择整个维度,x.size(0) 表示选择 x 张量的第一个维度的长度。因此,pe[:x.size(0), :] 表示选择张量 pe 中的前 x.size(0) 行,即与输入张量 x 的长度相同的行,以及选择所有列。

在这个位置编码的代码中,pe[:x.size(0), :] 用于选择位置编码张量 pe 中与输入张量 x 长度相同的部分,以确保位置编码的长度与输入数据的长度匹配。

2. PositionalEncoding

2.1 torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)

torch.arange(0, max_len, dtype=torch.float): 这一部分创建了一个张量,其中包含了从 0 到 max_len-1 的一系列数字。参数 0 是起始值,max_len 是结束值(不包含),dtype=torch.float 指定了张量的数据类型为浮点数。

.unsqueeze(1): 这一部分调用了张量的 unsqueeze 方法,将其维度扩展。参数 1 表示在维度 1 上进行扩展,即在第二个维度上增加一个维度。这样做的目的是为了将一维张量转换为二维张量,以便后续的计算能够正确进行。

综合起来,这一句代码的作用是创建了一个二维张量 position,其中包含了从 0 到 max_len-1 的一系列数字,每个数字都是浮点类型,并且张量的形状为 (max_len, 1)。这个张量用于表示序列中不同位置的位置信息,后续会用于计算位置编码。

本文作者:乐池

本文链接:https://www.cnblogs.com/ratillase/p/18187258

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   乐池  阅读(262)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起