基于Pytorch的LSTM物品移动预测算法

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 实现了一个多层双向LSTM模型,并用于训练一个时间序列预测任务

实验目的:

实现了一个多层双向LSTM模型,并用于训练一个时间序列预测任务

训练程序:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
from torch.utils.data import DataLoader, TensorDataset
# 定义多层双向LSTM模型
class MultiLayerBiLSTM(nn.Module):
    def __init__(self, input_size, hidden_size, output_size, num_layers):
        super(MultiLayerBiLSTM, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers=num_layers, batch_first=True, bidirectional=True)
        self.avg_pool = nn.AdaptiveAvgPool1d(1)  # 自适应平均池化层
        self.fc = nn.Linear(hidden_size * 2, output_size)
    def forward(self, x):
        output, _ = self.lstm(x.unsqueeze(1))  # 添加时间步维度
        output = output.permute(0, 2, 1)  # 将时间步维度移到第2维
        output = self.avg_pool(output)
        output = output.squeeze(2)  # 去掉平均池化的维度1
        output = self.fc(output)
        return output
# 训练函数
def train_model(data_folder, model_save_path):
    # 遍历数据文件夹中的所有CSV文件
    train_data = []
    for filename in os.listdir(data_folder):
        if filename.endswith(".csv"):
            file_path = os.path.join(data_folder, filename)
            df = np.genfromtxt(file_path, delimiter=',', skip_header=1)  # 使用numpy加载数据
            train_data.append(df)
    # 合并所有CSV文件为一个大的训练数据集
    train_data_combined = np.vstack(train_data)
    # 提取特征和标签
    X = train_data_combined[:, 1:4]  # Time列不作为特征
    y = train_data_combined[:, 1:4]  # 使用相同的坐标作为标签
    # 将数据转换为PyTorch张量
    X_tensor = torch.tensor(X, dtype=torch.float32)
    y_tensor = torch.tensor(y, dtype=torch.float32)
    # 数据分批处理
    batch_size = 32
    dataset = TensorDataset(X_tensor, y_tensor)
    dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
    # 定义模型和优化器
    input_size = 3
    hidden_size = 64
    output_size = 3
    num_layers = 2  # 设置多层LSTM
    model = MultiLayerBiLSTM(input_size, hidden_size, output_size, num_layers)
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")  # 使用GPU加速
    model.to(device)
    optimizer = optim.Adam(model.parameters(), lr=0.001)
    criterion = nn.MSELoss()
    # 训练模型
    num_epochs = 100
    for epoch in range(num_epochs):
        total_loss = 0
        for inputs, targets in dataloader:
            inputs, targets = inputs.to(device), targets.to(device)
            optimizer.zero_grad()
            outputs = model(inputs)
            loss = criterion(outputs, targets)
            loss.backward()
            optimizer.step()
            total_loss += loss.item()
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {total_loss/len(dataloader):.4f}')
    # 保存模型
    torch.save(model.state_dict(), model_save_path)
    print(f'Model saved as {model_save_path}')
# 运行训练函数并保存模型
train_data_folder = 'data/'  # 指定包含训练数据集的文件夹路径
model_save_path = 'model/model.pt'
train_model(train_data_folder, model_save_path)

程序解释:

这段代码是一个使用PyTorch实现的多层双向LSTM模型,并用于训练的程序。下面我来逐行解释代码的功能:
1. `#!/usr/bin/env python`: 这是一个Shebang行,它告诉系统使用哪个解释器来执行该脚本。在这里,它指定使用env命令查找Python解释器。
2. `# -*- coding: utf-8 -*-`: 这是指定Python源文件的字符编码为UTF-8,确保脚本中的中文等非ASCII字符可以被正确解析。
3. 导入所需的Python库和模块:
   - `os`: 提供与操作系统交互的功能,这里用于遍历数据文件夹中的CSV文件。
   - `torch`: PyTorch的主要库,用于构建和训练神经网络。
   - `torch.nn`: 包含神经网络的层和损失函数等。
   - `torch.optim`: 提供优化算法,如Adam等。
   - `numpy`: 用于数值计算和数据处理。
   - `torch.utils.data`: 提供数据加载和处理的实用工具。
4. 定义了一个多层双向LSTM模型 `MultiLayerBiLSTM`:
   - 该模型继承自`nn.Module`,是PyTorch中构建神经网络模型的基类。
   - 模型的初始化函数 `__init__` 接收输入特征大小、隐藏层大小、输出大小和LSTM层数作为参数,然后创建LSTM、自适应平均池化层和全连接层。
   - 模型的前向传播函数 `forward` 接收输入张量 x,将其传入LSTM层并进行平均池化和全连接操作,最后返回输出。
5. `train_model(data_folder, model_save_path)`: 这是训练函数的定义。它接收数据文件夹路径 `data_folder` 和模型保存路径 `model_save_path` 作为输入。
6. 在函数内部,代码首先遍历数据文件夹中的所有CSV文件,将它们加载到一个列表 `train_data` 中。
7. 然后将所有CSV文件的数据合并为一个大的训练数据集 `train_data_combined`。
8. 接下来,从训练数据集中提取特征和标签,其中 X 是输入特征,y 是标签。
9. 将数据转换为PyTorch张量,即 `X_tensor` 和 `y_tensor`。
10. 将数据划分为批次,并创建数据加载器 `dataloader`。
11. 定义模型和优化器:模型使用上面定义的 `MultiLayerBiLSTM` 类来创建,优化器使用Adam算法进行参数优化。
12. 开始模型训练,将模型移动到合适的设备(GPU或CPU),然后在每个epoch中遍历数据加载器,计算损失并执行反向传播更新参数。
13. 打印每个epoch的平均损失。
14. 训练完成后,将模型保存到指定的 `model_save_path`。
15. 最后,指定数据文件夹路径 `train_data_folder` 和模型保存路径 `model_save_path`,运行训练函数 `train_model`。

预测程序:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import torch
import torch.nn as nn
import pandas as pd
# 定义多层双向LSTM模型
class MultiLayerBiLSTM(nn.Module):
    def __init__(self, input_size, hidden_size, output_size, num_layers):
        super(MultiLayerBiLSTM, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers=num_layers, batch_first=True, bidirectional=True)
        self.avg_pool = nn.AdaptiveAvgPool1d(1)  # 自适应平均池化层
        self.fc = nn.Linear(hidden_size * 2, output_size)
    def forward(self, x):
        output, _ = self.lstm(x)
        output = output.permute(0, 2, 1)  # 将时间步维度移到第2维
        output = self.avg_pool(output)
        output = output.squeeze(2)  # 去掉平均池化的维度1
        output = self.fc(output)
        return output
# 加载模型函数
def load_model(model_path, input_size, hidden_size, output_size, num_layers):
    model = MultiLayerBiLSTM(input_size, hidden_size, output_size, num_layers)
    model.load_state_dict(torch.load(model_path))
    model.eval()
    return model
# 预测函数
def predict_next_five_frames(model, data_path, num_history_frames=20, num_prediction_frames=5):
    # 读取预测数据集
    df = pd.read_csv(data_path)
    X = df[['X', 'Y', 'Z']].values  # 只选择空间坐标,不包含时间信息
    # 将数据转换为PyTorch张量
    X_tensor = torch.tensor(X, dtype=torch.float32)
    # 历史输入(最后20帧数据)
    history_input = X_tensor[-num_history_frames:]
    # 进行预测
    with torch.no_grad():
        predicted_coordinates = []
        for i in range(num_prediction_frames):
            output = model(history_input.unsqueeze(0))
            predicted_coordinates.append(output.squeeze().tolist())
            # 将当前预测结果添加到历史输入中,作为下一次预测的输入
            history_input = torch.cat((history_input[1:], output), dim=0)
    # 输出预测结果
    print("Predicted coordinates (X, Y, Z) for the next 5 frames:")
    for coord in predicted_coordinates:
        print(coord)
# 模型参数
input_size = 3
hidden_size = 64
output_size = 3
num_layers = 2
# 预测数据集路径
predict_data_path = 'data/data_input.csv'
# 预训练的模型路径
pretrained_model_path = 'model/model.pt'
# 加载模型
model = load_model(pretrained_model_path, input_size, hidden_size, output_size, num_layers)
# 进行预测
predict_next_five_frames(model, predict_data_path)
相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
5月前
|
机器学习/深度学习 算法 数据挖掘
基于WOA鲸鱼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB 2022a/2024b实现,采用WOA优化的BiLSTM算法进行序列预测。核心代码包含完整中文注释与操作视频,展示从参数优化到模型训练、预测的全流程。BiLSTM通过前向与后向LSTM结合,有效捕捉序列前后文信息,解决传统RNN梯度消失问题。WOA优化超参数(如学习率、隐藏层神经元数),提升模型性能,避免局部最优解。附有运行效果图预览,最终输出预测值与实际值对比,RMSE评估精度。适合研究时序数据分析与深度学习优化的开发者参考。
|
5月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本内容包含基于BiLSTM与遗传算法(GA)的算法介绍及实现。算法通过MATLAB2022a/2024b运行,核心为优化BiLSTM超参数(如学习率、神经元数量),提升预测性能。LSTM解决传统RNN梯度问题,捕捉长期依赖;BiLSTM双向处理序列,融合前文后文信息,适合全局信息任务。附完整代码(含注释)、操作视频及无水印运行效果预览,适用于股票预测等场景,精度优于单向LSTM。
|
3月前
|
机器学习/深度学习 算法 数据可视化
近端策略优化算法PPO的核心概念和PyTorch实现详解
本文深入解析了近端策略优化(PPO)算法的核心原理,并基于PyTorch框架实现了完整的强化学习训练流程。通过Lunar Lander环境展示了算法的全过程,涵盖环境交互、优势函数计算、策略更新等关键模块。内容理论与实践结合,适合希望掌握PPO算法及其实现的读者。
620 2
近端策略优化算法PPO的核心概念和PyTorch实现详解
|
2月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
|
5月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本内容展示了一种基于粒子群优化(PSO)与时间卷积神经网络(TCN)的时间序列预测方法。通过 MATLAB2022a 实现,完整程序运行无水印,核心代码附详细中文注释及操作视频。算法利用 PSO 优化 TCN 的超参数(如卷积核大小、层数等),提升非线性时间序列预测性能。TCN 结构包含因果卷积层与残差连接,结合 LSTM 构建混合模型,经多次迭代选择最优超参数,最终实现更准确可靠的预测效果,适用于金融、气象等领域。
|
2月前
|
机器学习/深度学习 数据采集 资源调度
基于长短期记忆网络定向改进预测的动态多目标进化算法(LSTM-DIP-DMOEA)求解CEC2018(DF1-DF14)研究(Matlab代码实现)
基于长短期记忆网络定向改进预测的动态多目标进化算法(LSTM-DIP-DMOEA)求解CEC2018(DF1-DF14)研究(Matlab代码实现)
|
2月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
144 0
|
5月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。
|
9月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
280 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
|
5月前
|
机器学习/深度学习 数据采集 算法
基于GWO灰狼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于Matlab 2022a/2024b实现,结合灰狼优化(GWO)算法与双向长短期记忆网络(BiLSTM),用于序列预测任务。核心代码包含数据预处理、种群初始化、适应度计算及参数优化等步骤,完整版附带中文注释与操作视频。BiLSTM通过前向与后向处理捕捉序列上下文信息,GWO优化其参数以提升预测性能。效果图展示训练过程与预测结果,适用于气象、交通等领域。LSTM结构含输入门、遗忘门与输出门,解决传统RNN梯度问题,而BiLSTM进一步增强上下文理解能力。

推荐镜像

更多