下面是“pytorch教程实现mnist手写数字识别代码示例”的攻略。
概述
在这个教程中,我们将使用PyTorch框架来实现一个手写数字识别模型,即利用深度学习技术识别“0”到“9”共10个数字。我们将使用一个称为MNIST的数据集,它包含了大量由手写数字扫描所得的数字图像。具体而言,我们将建立一个由2个卷积层、2个全连接层和一个输出层组成的神经网络模型,以达到高准确率的分类效果。
步骤
- 下载和加载MNIST数据集。
首先,我们需要下载MNIST数据集并进行加载。PyTorch中提供了torchvision.datasets.MNIST()函数来下载和加载该数据集,该函数可以根据指定的根路径下载数据集。
from torchvision.datasets import MNIST
from torchvision import transforms
# 加载数据集
train_data = MNIST(root="./data", train=True, download=True, transform=transforms.ToTensor())
test_data = MNIST(root="./data", train=False, download=True, transform=transforms.ToTensor())
- 创建和训练模型。
我们将使用两个卷积层和两个全连接层来构建MNIST分类模型。需要注意的是,在构建模型之前,我们需要首先定义每个网络层的输入输出大小和层数,以及数据集的批处理大小。
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 64, 3, padding=1)
self.conv2 = nn.Conv2d(64, 32, 3, padding=1)
self.fc1 = nn.Linear(32 * 7 * 7, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = F.max_pool2d(x, 2)
x = self.conv2(x)
x = F.relu(x)
x = F.max_pool2d(x, 2)
x = x.view(-1, 32 * 7 * 7)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
x = F.log_softmax(x, dim=1)
return x
# 设置训练的超参数
batch_size = 64
learning_rate = 0.01
momentum = 0.5
epochs = 1
# 创建模型
model = Net()
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum)
# 训练模型
for epoch in range(epochs):
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
print("Training finished")
- 使用模型进行预测和测试。
在训练完成后,我们可以使用测试数据集来测试模型的准确性,以预测分类结果。
# 测试模型
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the test images: %d %%' % (100 * correct / total))
示例1
from torchvision.datasets import MNIST
from torchvision import transforms
train_data = MNIST(root="./data", train=True, download=True, transform=transforms.ToTensor())
test_data = MNIST(root="./data", train=False, download=True, transform=transforms.ToTensor())
在示例1中,我们使用PyTorch中的MNIST()方法,从指定的根目录下载和加载MNIST数据集,并使用transforms.ToTensor()方法将图像数据转换为PyTorch张量形式。
示例2
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 64, 3, padding=1)
self.conv2 = nn.Conv2d(64, 32, 3, padding=1)
self.fc1 = nn.Linear(32 * 7 * 7, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = F.max_pool2d(x, 2)
x = self.conv2(x)
x = F.relu(x)
x = F.max_pool2d(x, 2)
x = x.view(-1, 32 * 7 * 7)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
x = F.log_softmax(x, dim=1)
return x
batch_size = 64
learning_rate = 0.01
momentum = 0.5
epochs = 1
model = Net()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum)
for epoch in range(epochs):
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
print("Training finished")
在示例2中,我们定义了一个神经网络模型Net,它有两个卷积层和两个全连接层。我们使用nn.Module类来创建模型,该类封装了模型的架构以及一些有用的工具方法。在Net模型的forward()函数中,我们定义了前向传播的流程。在模型的训练中,我们以batch_size为单位,用指定的优化器和损失函数进行权重调整,训练集上的迭代次数为epochs,训练好的模型保存在model中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch教程实现mnist手写数字识别代码示例 - Python技术站