由于做导师项目需要,学习了一段时间LSTM神经网络。主要根据的是官网进行学习的。
https://pytorch.org/docs/stable/generated/torch.nn.LSTM.html#torch.nn.LSTM
里面告诉了我们torch里面的LSTM具体输入参数是什么,这告诉了我们怎么去准备序列数据。
输入数据
LSTM属于是特殊的一种循环神经网络,准备的数据是一种序列数据。因此我们处理数据的参数需要序列长度,以及确认是否单输入单输出。处理数据的代码如下:
def data_2_seq(data, length, single=True, feature_index=[0,1], out_index = [2]):
res = []
if single:
l = len(data)
for i in range(l-length):
seq = data[i: i+length]
label = data[i+length: i+1+length]
res.append((seq, label))
return res
else:
l = data.size(1)
for i in range(l-length):
seq = data[feature_index,i: i+length]
label = data[out_index,i+length: i+1+length]
res.append((seq, label))
return res
里面输入为序列,每一个序列对应一个标签,一般是序列的下一个数据。
模型定义
下面定义一个简单的网络,主要就是全连接层和LSTM层。
import torch
import torch.nn as nn
class LSTM1(nn.Module):
def __init__(self, inputsize = 1, hiddenlayer = 100, outputsize = 1):
super().__init__()
self.hiddenlayer = hiddenlayer
self.lstm = nn.LSTM(inputsize, hiddenlayer, batch_first=False) # batch_first=True,输入的数据为Batch*seq_len*inputsize;batch_first=False,输入的数据为seq__len*Batch*inputsize
self.liner = nn.Linear(hiddenlayer, outputsize)
def forward(self, seq):
lstm_out, (hn, cn) = self.lstm(seq.contiguous().view(seq.size()[1], 1, -1))
predictions = self.liner(lstm_out.view(seq.size()[1], -1))
return predictions[-1]
定义好模型后,就是训练函数了。
def train(data, net, epochs, opt, loss_func):
loss_hist = []
for epoch in range(epochs):
for seq, label in data:
label = label.reshape(len(label))
opt.zero_grad()
y_pre = net(seq)
loss = loss_func(y_pre, label)
loss.backward()
opt.step()
print("epoch ",epoch+1,": ",loss.item())
loss_hist.append(loss.item())
return net, loss_hist
然后上述各个模块整定好了之后,进入main.py进行调用即可。
from DataProcess import data_2_seq
from model import LSTM1
from train import train
import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
all_data = pd.read_csv("flights.csv")
data = all_data['passengers'].values.astype(float)
train_data = data[:-12]
train_data = np.vstack((train_data, train_data))
train_data = train_data.reshape(2, -1)
train_data = torch.tensor(train_data, dtype=torch.float32)
train_seq = data_2_seq(train_data, 12, single=False, feature_index=[0,1], out_index=[0,1])
net = LSTM1(inputsize=2, hiddenlayer=100, outputsize=2)
lr = 1e-3
optim = torch.optim.Adam(net.parameters(),lr = lr)
epochs = 5
loss_func = nn.MSELoss()
trained_model, loss_hist = train(train_seq, net, epochs, optim, loss_func)
torch.save(trained_model, "/home/code/lstm-free/a.pth")
# plt.plot(loss_hist)
# plt.show()
以上就是我使用Pytorch实现多维输入输出的全过程,完整的项目可以在我的仓库下载使用。
https://github.com/Roy-fyq/LSTM-with-multi-dimensional-input-and-output