使用PyTorch搭建LSTM实现沉降预测
时间: 2024-05-09 08:14:15 浏览: 128
沉降预测是地质工程中的一个重要问题。LSTM是一种常见的循环神经网络,可以用于时间序列预测,因此也可以用于沉降预测。下面是使用PyTorch搭建LSTM实现沉降预测的一个简单示例。
首先,我们需要准备数据。假设我们有一个地质工程数据集,其中包含沉降量的时间序列数据。我们可以使用Pandas库来读取和处理数据。
```python
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_csv('data.csv')
# 将数据转换为时间序列
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
# 将数据拆分为训练集和测试集
train_size = int(len(df) * 0.8)
train_data, test_data = df.iloc[:train_size], df.iloc[train_size:]
```
接下来,我们需要对数据进行归一化处理,以便于神经网络的训练。
```python
from sklearn.preprocessing import MinMaxScaler
# 对数据进行归一化处理
scaler = MinMaxScaler()
train_scaled = scaler.fit_transform(train_data)
test_scaled = scaler.transform(test_data)
```
然后,我们需要将数据转换为LSTM模型可以接受的格式。LSTM模型需要输入一个三维张量,其中第一维表示样本数,第二维表示时间步长,第三维表示特征数。在我们的示例中,时间步长为10,特征数为1(即沉降量)。
```python
# 将数据转换为LSTM模型可以接受的格式
def create_dataset(X, y, time_steps=1):
Xs, ys = [], []
for i in range(len(X) - time_steps):
Xs.append(X[i:i + time_steps])
ys.append(y[i + time_steps])
return np.array(Xs), np.array(ys)
time_steps = 10
X_train, y_train = create_dataset(train_scaled, train_scaled[:, 0], time_steps)
X_test, y_test = create_dataset(test_scaled, test_scaled[:, 0], time_steps)
print(X_train.shape) # (1766, 10, 1)
print(y_train.shape) # (1766,)
```
接下来,我们可以定义LSTM模型。在这个示例中,我们使用一个包含两个LSTM层的模型。
```python
import torch
import torch.nn as nn
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super().__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[:, -1, :])
return out
# 定义模型超参数
input_size = 1
hidden_size = 64
num_layers = 2
output_size = 1
# 实例化模型
model = LSTM(input_size, hidden_size, num_layers, output_size)
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
```
接下来,我们可以开始训练模型。训练过程如下:
```python
# 定义训练函数
def train_model(model, X_train, y_train, criterion, optimizer, num_epochs):
for epoch in range(num_epochs):
inputs = torch.from_numpy(X_train).float().to(device)
targets = torch.from_numpy(y_train).float().unsqueeze(1).to(device)
# 前向传播
outputs = model(inputs)
loss = criterion(outputs, targets)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 设置训练超参数
num_epochs = 100
# 开始训练模型
train_model(model, X_train, y_train, criterion, optimizer, num_epochs)
```
最后,我们可以使用训练好的模型进行预测。预测过程如下:
```python
# 定义预测函数
def predict(model, X):
model.eval()
X = torch.from_numpy(X).float().to(device)
with torch.no_grad():
y_pred = model(X)
return y_pred.cpu().numpy()
# 使用模型进行预测
train_pred = predict(model, X_train)
test_pred = predict(model, X_test)
# 反归一化处理
train_pred = scaler.inverse_transform(np.concatenate((train_pred, np.zeros((len(train_pred), 4))), axis=1))[:, 0]
test_pred = scaler.inverse_transform(np.concatenate((test_pred, np.zeros((len(test_pred), 4))), axis=1))[:, 0]
# 计算训练集和测试集的MSE
train_mse = mean_squared_error(train_data.iloc[time_steps:], train_pred)
test_mse = mean_squared_error(test_data.iloc[time_steps:], test_pred)
print(f'Train MSE: {train_mse:.4f}')
print(f'Test MSE: {test_mse:.4f}')
```
这就是使用PyTorch搭建LSTM实现沉降预测的一个简单示例。通过这个示例,你可以了解到如何使用PyTorch构建LSTM模型,以及如何将它应用于时间序列预测问题。
阅读全文