我的数据为一个excle,excle中有两列,分别为RS数据和LS数据 使用前面10个RS和LS数据预测接下来一个的LS数据,训练集为70%,验证集为15%,测试集为15%我们使用基于pytorch的BP神经网络代码
时间: 2024-03-17 14:45:50 浏览: 81
好的,那么接下来我将为你提供一个基于 PyTorch 的 BP 神经网络模型的完整代码示例,用于预测接下来一个 LS 数据。代码中包含了数据的导入、预处理、分割、模型的定义、训练、验证和测试等步骤。请注意,代码中的路径和文件名需要根据你的具体情况进行修改。
```
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
# 导入数据
df = pd.read_excel('data.xlsx')
rs_data = df['RS数据'].values
ls_data = df['LS数据'].values
# 数据预处理
rs_data = (rs_data - rs_data.min()) / (rs_data.max() - rs_data.min()) # 数据归一化
ls_data = (ls_data - ls_data.min()) / (ls_data.max() - ls_data.min()) # 数据归一化
# 分割数据集
train_size = int(len(rs_data) * 0.7)
val_size = int(len(rs_data) * 0.15)
test_size = len(rs_data) - train_size - val_size
train_rs, train_ls = rs_data[:train_size], ls_data[:train_size]
val_rs, val_ls = rs_data[train_size:train_size+val_size], ls_data[train_size:train_size+val_size]
test_rs, test_ls = rs_data[train_size+val_size:], ls_data[train_size+val_size:]
# 定义数据集类
class MyDataset(Dataset):
def __init__(self, rs, ls):
self.rs = rs
self.ls = ls
def __len__(self):
return len(self.rs) - 10
def __getitem__(self, idx):
rs = self.rs[idx:idx+10]
ls = self.ls[idx+10]
rs_tensor = torch.tensor(rs, dtype=torch.float32)
ls_tensor = torch.tensor(ls, dtype=torch.float32)
return rs_tensor, ls_tensor
# 创建数据加载器
train_dataset = MyDataset(train_rs, train_ls)
val_dataset = MyDataset(val_rs, val_ls)
test_dataset = MyDataset(test_rs, test_ls)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32)
test_loader = DataLoader(test_dataset, batch_size=32)
# 定义神经网络模型的结构
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(10, 64) # 第一层全连接层,输入维度为 10,输出维度为 64
self.fc2 = nn.Linear(64, 32) # 第二层全连接层,输入维度为 64,输出维度为 32
self.fc3 = nn.Linear(32, 1) # 第三层全连接层,输入维度为 32,输出维度为 1
def forward(self, x):
x = torch.relu(self.fc1(x)) # 第一层全连接层的激活函数为 ReLU
x = torch.relu(self.fc2(x)) # 第二层全连接层的激活函数为 ReLU
x = self.fc3(x) # 第三层全连接层的激活函数为线性函数
return x
# 定义损失函数和优化器
criterion = nn.MSELoss() # 损失函数为均方误差
optimizer = optim.Adam(net.parameters(), lr=0.01) # 优化器为 Adam,学习率为 0.01
# 创建神经网络模型
net = Net()
# 训练模型
for epoch in range(100):
for rs, ls in train_loader:
optimizer.zero_grad()
outputs = net(rs)
loss = criterion(outputs, ls)
loss.backward()
optimizer.step()
# 验证模型
with torch.no_grad():
val_loss = 0.0
for rs, ls in val_loader:
outputs = net(rs)
val_loss += criterion(outputs, ls).item()
val_loss /= len(val_loader)
print(f"Epoch {epoch+1}, Train Loss: {loss.item():.4f}, Val Loss: {val_loss:.4f}")
# 测试模型
with torch.no_grad():
test_loss = 0.0
for rs, ls in test_loader:
outputs = net(rs)
test_loss += criterion(outputs, ls).item()
test_loss /= len(test_loader)
print(f"Test Loss: {test_loss:.4f}")
# 预测结果
inputs = torch.tensor(test_rs[-10:], dtype=torch.float32)
predicted_ls = net(inputs).item()
print(f"Predicted LS: {predicted_ls:.4f}")
```
在这个例子中,我们首先使用 Pandas 库读取 Excel 文件,并对 RS 和 LS 数据进行归一化处理。然后,我们将数据集分为训练集、验证集和测试集,并创建了一个自定义的数据集类 `MyDataset`,用于将数据加载到神经网络模型中。接着,我们定义了一个包含三个全连接层的神经网络,并选择了均方误差作为损失函数,使用 Adam 优化器进行模型的优化,学习率为 0.01。在训练过程中,我们使用训练集中的数据进行训练,并根据验证集的误差来调整模型的参数,直到模型收敛。在测试阶段,我们使用测试集中的数据来测试训练好的模型的性能,计算模型的精度和误差。最后,我们将前 10 个 RS 数据输入到模型中,预测接下来一个 LS 数据的值,并输出预测结果。
阅读全文