目录
模型搭建
模型基础
图1 RNN网络结构
class LSTM(nn.Module):
def __init__(self,input_size,hidden_size,num_layers,output_size,batch_size):
super().__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.num_layers = num_layers
self.output_size = output_size
self.batch_size = batch_size
self.num_directions = 1
self.lstm = nn.LSTM(self.input_size,self.hidden_size,self.num_layers,batch_first=True)
self.linear = nn.Linear(self.hidden_size,self.output_size)
def forward(self,inputseq):
h_0 = torch.randn(self.num_directions*self.num_layers,self.batch_size,self.hidden_size).to(device)
c_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
output,_ = self.lstm(inputseq,(h_0,c_0))
pred = self.linear(output[:,-1,:])
return pred
要点
1)关于nn.Module类:nn.Module是神经网络模型的基础类,自定义层/块/模型均需要继承该模型,并重新实现__init__()构造函数和forward前向函数。一般,构造函数只定义一些层,在forward函数中定义层间的连接关系。super().__init__()指的是继承父类的初始化方法。只要定义了forward函数,可以通过autograd自动实现反向求导。
2)关于LSTM的结构:input(batch_size,seq_len,input_size)
h_0/c_0(number_directions*num_layers,batch_size,hidden_size)
output(batch_size,seq_len,hidden_size)
其中:batch_size表示一次性输入的个数,seq_len表示输入的时间序列长度,input_size表示几元变量,hidden_size表示隐藏层神经单元个数。
单元测试
model = LSTM(1,32,2,1,2)
test_input = torch.tensor([[70, 80, 90],[70, 80, 90]]).float().unsqueeze(2)
predicted_output = model(test_input)
print(predicted_output)
数据准备
数据来源
天池-某地区电网某地区电网2018年1月1日至2021年8月31日间隔 15 分钟的电力系统负荷数据,链接为:电网_数据集-阿里云天池 (aliyun.com)
数据读取
def read_data(filename):
data = pd.read_csv(filename,skiprows=1)
data.head(5)