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

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

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,CNN-LSTM神经网络结构通常用于处理时间序列数据,其中CNN用于提取时间序列中的空间特征,LSTM用于处理时间序列中的时间依赖性。 对于多变量回归预测任务,我们可以采用以下步骤来实现CNN-LSTM神经网络: 1. 准备数据集:将多个变量的时间序列数据集合并成一个多维数组,其中每个维度表示一个变量,每个时间步表示一个样本。 2. 数据预处理:对数据进行归一化处理,使得每个变量的数值范围都在 [0,1] 之间。 3. 构建模型:使用PyTorch构建一个CNN-LSTM神经网络模型,其中CNN部分使用卷积层提取空间特征,LSTM部分处理时间序列数据,最后输出多个变量的预测结果。 4. 训练模型:使用训练集对模型进行训练,采用均方误差(MSE)作为损失函数。 5. 测试模型:使用测试集对模型进行测试,计算均方误差和平均绝对误差(MAE)等指标来评估模型性能。 下面是一个简单的CNN-LSTM神经网络实现的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np # 构建CNN-LSTM神经网络模型 class CNNLSTM(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(CNNLSTM, self).__init__() self.hidden_size = hidden_size self.conv1 = nn.Conv2d(1, 32, kernel_size=(3, 3), padding=(1, 1)) self.conv2 = nn.Conv2d(32, 64, kernel_size=(3, 3), padding=(1, 1)) self.pool = nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)) self.lstm = nn.LSTM(input_size, hidden_size) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.conv1(x) x = nn.functional.relu(x) x = self.pool(x) x = self.conv2(x) x = nn.functional.relu(x) x = self.pool(x) x = x.permute(3, 0, 1, 2) _, (h, _) = self.lstm(x) h = h.squeeze() out = self.fc(h) return out # 准备数据集 data = np.random.rand(100, 5, 10) # 100个样本,5个变量,每个变量10个时间步 target = np.random.rand(100, 3) # 100个样本,3个变量的预测结果 # 数据预处理 data = (data - np.min(data)) / (np.max(data) - np.min(data)) target = (target - np.min(target)) / (np.max(target) - np.min(target)) # 转换为PyTorch张量 data = torch.from_numpy(data).float() target = torch.from_numpy(target).float() # 定义模型和优化器 model = CNNLSTM(5, 64, 3) optimizer = optim.Adam(model.parameters(), lr=0.001) criterion = nn.MSELoss() # 训练模型 for epoch in range(100): optimizer.zero_grad() output = model(data.unsqueeze(1)) loss = criterion(output.squeeze(), target) loss.backward() optimizer.step() if epoch % 10 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, 100, loss.item())) # 测试模型 with torch.no_grad(): test_data = np.random.rand(10, 5, 10) # 10个测试样本 test_data = (test_data - np.min(test_data)) / (np.max(test_data) - np.min(test_data)) test_data = torch.from_numpy(test_data).float() test_output = model(test_data.unsqueeze(1)) print('Test Output: ', test_output.squeeze().numpy()) ``` 在上述代码中,首先定义了一个CNNLSTM类作为CNN-LSTM神经网络模型。模型包括两个部分:CNN部分和LSTM部分。CNN部分使用两个卷积层和一个最大池化层提取空间特征,LSTM部分处理时间序列数据。最后,使用一个全连接层输出多个变量的预测结果。 然后,我们准备了一个随机的多变量时间序列数据集,并将其归一化处理。接着,我们定义了一个Adam优化器和一个均方误差损失函数,并使用训练集对模型进行训练。 最后,我们使用测试集对模型进行测试,并计算均方误差和平均绝对误差等指标来评估模型性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值