PyTorch一小时掌握之神经网络气温预测篇
PyTorch是一种常用的深度学习框架,它提供了丰富的工具和函数,可以帮助我们快速构建和训练深度学习模型。本文将详细讲解如何使用PyTorch构建神经网络模型,并使用该模型进行气温预测。本文将分为以下几个部分:
-
数据准备:我们将使用气温数据集来训练和测试神经网络模型。
-
模型构建:我们将使用PyTorch构建一个简单的神经网络模型。
-
模型训练:我们将使用PyTorch的优化器和损失函数来训练神经网络模型。
-
模型测试:我们将使用测试数据集来测试神经网络模型的性能。
-
示例说明:我们将提供两个示例说明,分别是使用PyTorch进行气温预测和图像分类。
1. 数据准备
我们将使用气温数据集来训练和测试神经网络模型。该数据集包含了每天的最高气温和最低气温,我们将使用最高气温来预测最低气温。以下是数据集的示例:
# Date,MaxTemp,MinTemp
01/01/2010,32,20
01/02/2010,35,22
01/03/2010,33,21
01/04/2010,30,18
01/05/2010,29,16
我们将使用Pandas库来读取和处理数据集。以下是数据准备的示例代码:
import pandas as pd
import numpy as np
# 读取数据集
data = pd.read_csv('temperature.csv')
# 处理数据集
data['MaxTemp'] = (data['MaxTemp'] - 32) * 5/9
data['MinTemp'] = (data['MinTemp'] - 32) * 5/9
data = data[['MaxTemp', 'MinTemp']]
data = data.to_numpy()
在这个示例中,我们首先使用Pandas库的read_csv函数来读取气温数据集。然后,我们使用numpy库来处理数据集,将最高气温和最低气温转换为摄氏度,并将数据集转换为numpy数组。
2. 模型构建
我们将使用PyTorch构建一个简单的神经网络模型,该模型包含一个输入层、一个隐藏层和一个输出层。以下是模型构建的示例代码:
import torch
import torch.nn as nn
# 定义神经网络模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(1, 10)
self.fc2 = nn.Linear(10, 1)
self.relu = nn.ReLU()
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# 创建神经网络模型
net = Net()
在这个示例中,我们首先定义了一个名为Net的神经网络模型,该模型包含一个输入层、一个隐藏层和一个输出层。我们使用PyTorch的nn.Linear函数来定义线性层,使用nn.ReLU函数来定义激活函数。然后,我们使用PyTorch的nn.Module类来创建神经网络模型。
3. 模型训练
我们将使用PyTorch的优化器和损失函数来训练神经网络模型。以下是模型训练的示例代码:
import torch.optim as optim
# 定义优化器和损失函数
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 训练神经网络模型
for epoch in range(1000):
running_loss = 0.0
for i in range(len(data)):
# 获取输入和输出
inputs = torch.tensor(data[i][0]).float()
labels = torch.tensor(data[i][1]).float()
# 前向传播和反向传播
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 统计损失值
running_loss += loss.item()
# 输出损失值
if epoch % 100 == 99:
print('[%d] loss: %.3f' % (epoch + 1, running_loss / len(data)))
在这个示例中,我们首先定义了一个名为criterion的损失函数,使用PyTorch的nn.MSELoss函数来定义均方误差损失函数。然后,我们定义了一个名为optimizer的优化器,使用PyTorch的optim.SGD函数来定义随机梯度下降优化器。接着,我们使用PyTorch的for循环来训练神经网络模型。在每个epoch中,我们使用PyTorch的for循环来遍历数据集,并使用PyTorch的tensor函数将输入和输出转换为张量。然后,我们使用PyTorch的zero_grad函数来清除梯度,使用PyTorch的forward函数进行前向传播,使用PyTorch的backward函数进行反向传播,使用PyTorch的step函数更新参数。最后,我们使用PyTorch的item函数将损失值转换为标量,并输出损失值。
4. 模型测试
我们将使用测试数据集来测试神经网络模型的性能。以下是模型测试的示例代码:
# 定义测试数据集
test_data = np.array([[35], [36], [37], [38], [39], [40]])
# 测试神经网络模型
for i in range(len(test_data)):
# 获取输入和输出
inputs = torch.tensor(test_data[i][0]).float()
# 进行预测
outputs = net(inputs)
predicted = outputs.item()
# 输出预测结果
print('Input: %.1f, Predicted: %.1f' % (test_data[i][0], predicted))
在这个示例中,我们首先定义了一个名为test_data的测试数据集,包含了一些最高气温。然后,我们使用PyTorch的for循环来遍历测试数据集,并使用PyTorch的tensor函数将输入转换为张量。接着,我们使用PyTorch的forward函数进行预测,并使用PyTorch的item函数将预测结果转换为标量。最后,我们输出预测结果。
5. 示例说明
以下是两个使用PyTorch进行气温预测和图像分类的示例说明:
5.1. 气温预测
我们可以使用PyTorch构建神经网络模型来预测气温。以下是气温预测的示例代码:
import torch
import torch.nn as nn
import numpy as np
# 定义神经网络模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(1, 10)
self.fc2 = nn.Linear(10, 1)
self.relu = nn.ReLU()
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# 创建神经网络模型
net = Net()
# 定义优化器和损失函数
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 训练神经网络模型
for epoch in range(1000):
running_loss = 0.0
for i in range(len(data)):
# 获取输入和输出
inputs = torch.tensor(data[i][0]).float()
labels = torch.tensor(data[i][1]).float()
# 前向传播和反向传播
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 统计损失值
running_loss += loss.item()
# 输出损失值
if epoch % 100 == 99:
print('[%d] loss: %.3f' % (epoch + 1, running_loss / len(data)))
# 定义测试数据集
test_data = np.array([[35], [36], [37], [38], [39], [40]])
# 测试神经网络模型
for i in range(len(test_data)):
# 获取输入和输出
inputs = torch.tensor(test_data[i][0]).float()
# 进行预测
outputs = net(inputs)
predicted = outputs.item()
# 输出预测结果
print('Input: %.1f, Predicted: %.1f' % (test_data[i][0], predicted))
在这个示例中,我们首先定义了一个名为Net的神经网络模型,该模型包含一个输入层、一个隐藏层和一个输出层。然后,我们使用PyTorch的nn.Module类来创建神经网络模型。接着,我们定义了一个名为criterion的损失函数,使用PyTorch的nn.MSELoss函数来定义均方误差损失函数。然后,我们定义了一个名为optimizer的优化器,使用PyTorch的optim.SGD函数来定义随机梯度下降优化器。接着,我们使用PyTorch的for循环来训练神经网络模型。在每个epoch中,我们使用PyTorch的for循环来遍历数据集,并使用PyTorch的tensor函数将输入和输出转换为张量。然后,我们使用PyTorch的zero_grad函数来清除梯度,使用PyTorch的forward函数进行前向传播,使用PyTorch的backward函数进行反向传播,使用PyTorch的step函数更新参数。最后,我们使用PyTorch的item函数将损失值转换为标量,并输出损失值。接着,我们定义了一个名为test_data的测试数据集,包含了一些最高气温。然后,我们使用PyTorch的for循环来遍历测试数据集,并使用PyTorch的tensor函数将输入转换为张量。接着,我们使用PyTorch的forward函数进行预测,并使用PyTorch的item函数将预测结果转换为标量。最后,我们输出预测结果。
5.2. 图像分类
我们可以使用PyTorch构建神经网络模型来进行图像分类。以下是图像分类的示例代码:
import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision.datasets as datasets
# 定义神经网络模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
self.relu = nn.ReLU()
def forward(self, x):
x = self.conv1(x)
x = self.relu(x)
x = self.pool(x)
x = self.conv2(x)
x = self.relu(x)
x = self.pool(x)
x = x.view(-1, 16 * 5 * 5)
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
x = self.relu(x)
x = self.fc3(x)
return x
# 创建神经网络模型
net = Net()
# 定义数据转换
transform = transforms.Compose([
transforms.Resize(32),
transforms.CenterCrop(32),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
# 加载数据集
trainset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
testset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)
# 定义优化器和损失函数
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 训练神经网络模型
for epoch in range(2):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# 获取输入和输出
inputs, labels = data
# 前向传播和反向传播
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 统计损失值
running_loss += loss.item()
# 输出损失值
if i % 2000 == 1999:
print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
# 测试神经网络模型
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
# 获取输入和输出
images, labels = data
# 进行预测
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
# 输出准确率
print('Accuracy: %.2f %%' % (100 * correct / total))
在这个示例中,我们首先定义了一个名为Net的神经网络模型,该模型包含了卷积层、池化层和全连接层。然后,我们使用PyTorch的nn.Module类来创建神经网络模型。接着,我们定义了一个名为transform的数据转换,使用PyTorch的transforms.Compose函数来定义数据转换。然后,我们使用PyTorch的datasets.CIFAR10函数来加载CIFAR10数据集,并使用PyTorch的DataLoader函数来创建数据加载器。接着,我们定义了一个名为criterion的损失函数,使用PyTorch的nn.CrossEntropyLoss函数来定义交叉熵损失函数。然后,我们定义了一个名为optimizer的优化器,使用PyTorch的torch.optim.SGD函数来定义随机梯度下降优化器。接着,我们使用PyTorch的for循环来训练神经网络模型。在每个epoch中,我们使用PyTorch的for循环来遍历数据加载器,并使用PyTorch的zero_grad函数来清除梯度,使用PyTorch的forward函数进行前向传播,使用PyTorch的backward函数进行反向传播,使用PyTorch的step函数更新参数。最后,我们使用PyTorch的torch.no_grad函数来关闭梯度计算,使用PyTorch的torch.max函数来获取预测结果,使用PyTorch的item函数将预测结果转换为标量。最后,我们输出准确率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch一小时掌握之神经网络气温预测篇 - Python技术站