pytorch 中LSTM的输出值

1. 官方手册

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. output, h_n, c_n 之间的关系

在这里插入图片描述
首先,Pytorch中的LSTM有三个输出 output, hn, cn。

可以把hn理解为当前时刻,LSTM层的输出结果,而cn是记忆单元中的值,output则是包括当前时刻以及之前时刻所有hn的输出值

  • 在只有单时间步的时候,
    output = hn
  • 多时间步时,
    output可以看做是各个时间点hn的输出

3. 代码

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

# 随机生成数据
torch.manual_seed(1)

# 定义一层的LSTM神经网络
lstm = nn.LSTM(3, 2)  # Input dim is 3, output dim is 3

# 生成一个序列长度为5的数据,一个点看成是一个时刻
inputs = [torch.randn(1, 3) for _ in range(5)]

# 初始化 隐藏状态,
#   LSTM层数为1
#   batch为1
#   hidden_size:1
# initialize the hidden state.
hidden = (torch.randn(1, 1, 2),
          torch.randn(1, 1, 2))

# 第一种获取输出的方式,循环多个时间步,得到每个时刻的输出
for i in inputs:
    # Step through the sequence one element at a time.
    # after each step, hidden contains the hidden state.
    out, hidden = lstm(i.view(1, 1, -1), hidden)


# 第二种获取输出的方式,把输入格式变为:seq_len, batch, input_size 的三维张量
inputs = torch.cat(inputs).view(len(inputs), 1, -1)
'''
tensor([[[ 0.3482,  1.1371, -0.3339]],

        [[-1.4724,  0.7296, -0.1312]],

        [[-0.6368,  1.0429,  0.4903]],

        [[ 1.0318, -0.5989,  1.6015]],

        [[-1.0735, -1.2173,  0.6472]]])
'''

hidden = (torch.randn(1, 1, 2), torch.randn(1, 1, 2))  # clean out hidden state
out, hidden = lstm(inputs, hidden)
print(out)
'''
tensor([[[-0.0468,  0.1818]],

        [[-0.1173,  0.1622]],

        [[-0.2076,  0.1286]],

        [[-0.0474,  0.0851]],

        [[-0.0185,  0.1172]]], 
'''
print("h的最后一个值等于output的最后一个值")
print(hidden)
'''
h: tensor([[[-0.0185,  0.1172]]], grad_fn=<StackBackward>)
c: tensor([[[-0.0603,  0.1560]]], grad_fn=<StackBackward>)
'''

### 使用 PyTorch LSTM 模型实现泵压预测 #### 准备环境和导入必要的库 为了使用 PyTorch 实现基于 LSTM 的泵压预测,首先需要安装并导入所需的 Python 库。确保环境中已安装 `pytorch` 及其依赖项。 ```python import torch from torch import nn, optim from sklearn.preprocessing import MinMaxScaler import numpy as np import pandas as pd ``` #### 加载与预处理数据 对于泵压预测任务,假设有一个包含历史泵压读数的时间序列文件(CSV 文件)。这些数据应当被清理、填充缺失,并转换为适合 LSTM 输入的形式——即三维张量 `(batch_size, sequence_length, feature_num)`。 ```python def load_and_preprocess_data(file_path): df = pd.read_csv(file_path) scaler = MinMaxScaler(feature_range=(-1, 1)) scaled_df = scaler.fit_transform(df[['pressure']]) X_train, y_train = [], [] seq_len = 60 for i in range(len(scaled_df)-seq_len-1): _X = scaled_df[i:(i+seq_len)] _y = scaled_df[(i + seq_len), 0] X_train.append(_X) y_train.append(_y) X_train, y_train = np.array(X_train), np.array(y_train) X_train = torch.from_numpy(X_train).float() y_train = torch.from_numpy(y_train).float() return X_train.unsqueeze(2), y_train.unsqueeze(1), scaler ``` 此函数会返回三个对象:训练特征矩阵 `X_train`、目标变量 `y_train` 和用于后续反缩放操作的 Scaler 对象[^2]。 #### 构建 LSTM 模型结构 定义一个继承自 `nn.Module` 类的新类来创建 LSTM 网络架构。这里设置了一个简单的两层 LSTM 层加上全连接输出层。 ```python class LSTMPredictor(nn.Module): def __init__(self, input_dim=1, hidden_dim=50, num_layers=2, output_dim=1): super(LSTMPredictor, self).__init__() self.hidden_dim = hidden_dim self.num_layers = num_layers self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): h_0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_() c_0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_() out, (hn, cn) = self.lstm(x, (h_0.detach(), c_0.detach())) out = self.fc(out[:, -1, :]) return out ``` 上述代码片段展示了如何设计一个多层 LSTM 结构以及最后通过线性变换得到最终输出[^3]。 #### 设置超参数及初始化模型实例 选择适当的学习率、批量大小和其他配置选项;然后实例化前面定义过的 LSTM 模型。 ```python input_dim = 1 hidden_dim = 50 num_layers = 2 output_dim = 1 learning_rate = 0.001 epochs = 100 batch_size = 72 model = LSTMPredictor(input_dim=input_dim, hidden_dim=hidden_dim, num_layers=num_layers, output_dim=output_dim) criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) ``` 这段脚本指定了训练过程中使用的损失计算方式(均方差),同时也选择了 Adam 优化器来进行梯度下降更新[^4]。 #### 开始训练循环 编写一段逻辑控制整个训练流程,在每轮迭代结束时打印当前进度信息。 ```python for epoch in range(epochs): outputs = model(X_train) optimizer.zero_grad() loss = criterion(outputs, y_train) loss.backward() optimizer.step() if epoch % 10 == 0: print(f'Epoch {epoch}, Loss: {loss.item():.4f}') ``` 以上就是完整的训练过程描述,其中包含了前向传播、反向传播以及参数更新等步骤。 #### 测试阶段 完成训练之后,可以通过加载保存的最佳权重版本并对新数据做出预测: ```python # 假设 test_loader 是经过相同预处理后的测试集 DataLoader with torch.no_grad(): predictions = [] for inputs in test_loader: pred = model(inputs.float()) predictions.extend(pred.numpy().flatten()) predictions = scaler.inverse_transform(np.array(predictions).reshape(-1, 1)) print("Predicted Pump Pressure:", predictions[:10]) # 打印前十条预测结果 ``` 在此基础上还可以进一步分析预测效果的好坏,比如绘制图表对比实际与预测之间的差距等等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值