PyTorch是一个开源的Python机器学习库,被广泛应用于深度学习领域。本文将介绍如何使用PyTorch实现一个简单的神经网络,并在MNIST数据集上进行训练和测试。
- 环境准备
首先需要安装PyTorch和相关的依赖库。可以通过以下命令安装PyTorch:
pip install torch torchvision
- 数据集准备
我们将使用MNIST手写数字数据集,这是一个非常经典的数据集,包含60,000个训练样本和10,000个测试样本。可以使用以下代码下载数据集:
关注v❤公众H:Ai技术星球 回复(123)必领pytorch深度学习资料
- 数据预处理
在使用数据集之前,需要对其进行预处理。在本例中,我们将把每个数字图像缩放到28×28大小,并将像素值归一化到0到1之间。可以使用以下代码完成预处理:
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.Resize((28, 28)),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
train_dataset.transform = transform
test_dataset.transform = transform
- 定义神经网络模型
我们将使用一个简单的多层感知机(MLP)模型来对MNIST数据集进行分类。该模型有两个隐藏层,每个隐藏层有128个神经元,并且使用ReLU激活函数。输出层有10个神经元,对应于0到9的数字。可以使用以下代码定义模型:
import torch.nn as nn
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.Linear(128, 128)
self.fc3 = nn.Linear(128, 10)
self.relu = nn.ReLU()
def forward(self, x):
x = x.view(-1, 28*28)
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.fc3(x)
return x
- 定义损失函数和优化器
我们将使用交叉熵损失函数和随机梯度下降(SGD)优化器。可以使用以下代码定义损失函数和优化器:
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
- 训练模型
现在我们可以开始训练模型了。可以使用以下代码训练模型:
num_epochs = 10
当你完成了神经网络的构建之后,你需要通过数据进行训练。下面是一个简单的训练示例:
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 训练网络
for epoch in range(10): # 循环遍历数据集多次
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: # 每2000批次打印一次平均损失
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print('Finished Training')
在这个示例中,我们使用交叉熵损失函数和随机梯度下降(SGD)优化器进行训练。我们循环遍历数据集10次,并在每个批次中进行前向传播、反向传播和优化。每2000批次,我们打印一次平均损失。完成训练后,我们打印出“Finished Training”消息。
最后,我们可以使用测试集来评估我们的网络:
# 在测试集上测试网络
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 of the network on the 10000 test images: %d %%' % (
100 * correct / total))
在这个示例中,我们循环遍历测试集,并在每个图像上运行我们的网络。我们使用torch.max()函数来获取每个输出张量的最大值和相应的索引。然后,我们统计正确的分类数,并计算准确率。最后,我们打印出准确率。
这是一个基本的用PyTorch实现神经网络的示例。随着你深入学习,你可以探索更复杂的网络结构、不同的优化器和损失函数,以及更高级的功能,例如自动微分和并行化训练。
关注v❤公众H:Ai技术星球 回复(123)必领pytorch深度学习资料
还有500G人工智能学习资料包内含:
①人工智能课程及项目实战【含课件源码】
②超详解的人工智能学习路线图
③人工智能必看优质书籍电子书汇总(著作书籍这都有)
④国内外知名精华资源(国际AI权威学者课程与资料)
⑤优质人工智能资源网站整理(找前辈、找代码、找论文都有)
⑥人工智能行业报告 ⑦人工智能论文合集(不知道看什么论文就来这!) 是真的白嫖不要米哦~~[脱单doge]