Pytorch实现多输入多输出LSTM神经网络(含代码)

您所在的位置:网站首页 hbomax输入代码 Pytorch实现多输入多输出LSTM神经网络(含代码)

Pytorch实现多输入多输出LSTM神经网络(含代码)

2024-07-06 09:07| 来源: 网络整理| 查看: 265

由于做导师项目需要,学习了一段时间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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3