深度学习入门篇:PyTorch实现手写数字识别

深度学习作为机器学习的一个分支,近年来在图像识别、自然语言处理等领域取得了显著的成就。在众多的深度学习框架中,PyTorch以其动态计算图、易用性强和灵活度高等特点,受到了广泛的喜爱。本篇文章将带领大家使用PyTorch框架,实现一个手写数字识别的基础模型。

手写数字识别简介

手写数字识别是计算机视觉领域的一个经典问题,目的是让计算机能够识别并理解手写数字图像。这个问题通常作为深度学习入门的练习,因为它涉及到图像处理和分类的基本技能。

数据集介绍

在手写数字识别任务中,最常用的数据集是MNIST。MNIST数据集包含了60,000个训练样本和10,000个测试样本,每个样本是28x28像素的手写数字灰度图像,以及对应的标签(0-9的数字)。

PyTorch简介

PyTorch是一个开源的机器学习库,广泛用于计算机视觉和自然语言处理领域。它提供了两个高级功能:

  1. 动态计算图(Dynamic Computation Graphs),可以在运行时修改图形结构。
  2. 自动微分(Automatic Gradients),可以自动计算梯度,简化了梯度计算和模型优化的过程。

环境准备

在开始之前,确保你已经安装了PyTorch。可以通过以下命令安装PyTorch:

pip install torch torchvision

构建模型

我们将构建一个简单的卷积神经网络(CNN)来识别手写数字。CNN是处理图像数据的强大工具,能够提取图像的特征。

导入必要的库

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

定义数据预处理

transform = transforms.Compose([
    transforms.ToTensor(),  # 将图片转换为Tensor
    transforms.Normalize((0.5,), (0.5,))  # 归一化处理
])

加载数据集

train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)

train_loader = DataLoader(dataset=train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=32, shuffle=False)

定义CNN模型

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)  # 输入通道1,输出通道10
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = torch.flatten(x, 1)  # 展平
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

model = Net()

定义损失函数和优化器

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

训练模型

训练过程

def train(model, device, train_loader, optimizer, epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % 100 == 0:
            print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} ({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')

测试模型

def test(model, device, test_loader):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            output = model(data)
            test_loss += criterion(output, target).item()
            pred = output.argmax(dim=1, keepdim=True)
            correct += pred.eq(target.view_as(pred)).sum().item()

    test_loss /= len(test_loader.dataset)
    print(f'\nTest set: Average loss: {test_loss:.4f}, Accuracy: {correct}/{len(test_loader.dataset)} ({100. * correct / len(test_loader.dataset):.0f}%)\n')

运行训练和测试

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
for epoch in range(1, 11):
    train(model, device, train_loader, optimizer, epoch)
    test(model, device, test_loader)

结语

通过上述步骤,我们使用PyTorch实现了一个基础的手写数字识别模型。这个模型虽然简单,但它涵盖了深度学习中的许多关键概念,如卷积神经网络、数据预处理、模型训练和测试等。随着你对深度学习的进一步学习,你可以尝试优化这个模型,或者尝试解决更复杂的图像识别问题。

✅作者简介:热爱科研的人工智能开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

获取更多人工智能资料可点击链接进群领取,谢谢支持!

点击领取更多详细资料

你可能感兴趣的:(深度学习,pytorch,人工智能)