基于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)
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
3月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】43. 算法优化之Adam算法【RMSProp算法与动量法的结合】介绍及其Pytorch实现
【从零开始学习深度学习】43. 算法优化之Adam算法【RMSProp算法与动量法的结合】介绍及其Pytorch实现
|
3月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】40. 算法优化之AdaGrad算法介绍及其Pytorch实现
【从零开始学习深度学习】40. 算法优化之AdaGrad算法介绍及其Pytorch实现
|
3月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
|
22天前
|
机器学习/深度学习 存储 算法
强化学习实战:基于 PyTorch 的环境搭建与算法实现
【8月更文第29天】强化学习是机器学习的一个重要分支,它让智能体通过与环境交互来学习策略,以最大化长期奖励。本文将介绍如何使用PyTorch实现两种经典的强化学习算法——Deep Q-Network (DQN) 和 Actor-Critic Algorithm with Asynchronous Advantage (A3C)。我们将从环境搭建开始,逐步实现算法的核心部分,并给出完整的代码示例。
53 1
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
【优秀python系统毕设】基于Python flask的气象数据可视化系统设计与实现,有LSTM算法预测气温
本文介绍了一个基于Python Flask框架开发的气象数据可视化系统,该系统集成了数据获取、处理、存储、LSTM算法气温预测以及多种数据可视化功能,旨在提高气象数据的利用价值并推动气象领域的发展。
|
1月前
|
机器学习/深度学习 数据采集 存储
基于Python+flask+echarts的气象数据采集与分析系统,可实现lstm算法进行预测
本文介绍了一个基于Python、Flask和Echarts的气象数据采集与分析系统,该系统集成了LSTM算法进行数据预测,并提供了实时数据监测、历史数据查询、数据可视化以及用户权限管理等功能。
|
1月前
|
机器学习/深度学习 算法 数据可视化
基于Python flask的豆瓣电影数据分析可视化系统,功能多,LSTM算法+注意力机制实现情感分析,准确率高达85%
本文介绍了一个基于Python Flask框架的豆瓣电影数据分析可视化系统,该系统集成了LSTM算法和注意力机制进行情感分析,准确率高达85%,提供了多样化的数据分析和情感识别功能,旨在帮助用户深入理解电影市场和观众喜好。
|
3月前
|
机器学习/深度学习 存储 人工智能
算法金 | LSTM 原作者带队,一个强大的算法模型杀回来了
**摘要:** 本文介绍了LSTM(长短期记忆网络)的发展背景和重要性,以及其创始人Sepp Hochreiter新推出的xLSTM。LSTM是为解决传统RNN长期依赖问题而设计的,广泛应用于NLP和时间序列预测。文章详细阐述了LSTM的基本概念、核心原理、实现方法和实际应用案例,包括文本生成和时间序列预测。此外,还讨论了LSTM与Transformer的竞争格局。最后,鼓励读者深入学习和探索AI领域。
46 7
算法金 | LSTM 原作者带队,一个强大的算法模型杀回来了
|
3月前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
77 6
|
3月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】36. 门控循环神经网络之长短期记忆网络(LSTM)介绍、Pytorch实现LSTM并进行训练预测
【从零开始学习深度学习】36. 门控循环神经网络之长短期记忆网络(LSTM)介绍、Pytorch实现LSTM并进行训练预测

热门文章

最新文章