pytorch实现手写数字图片识别

PyTorch是一个基于Python的科学计算库,它主要用于深度学习研究。在本文中,我们将介绍如何使用PyTorch实现手写数字图片识别。我们将分为两个部分,第一部分是数据预处理和模型训练,第二部分是模型测试和结果分析。

第一部分:数据预处理和模型训练

数据预处理

我们将使用MNIST数据集,该数据集包含60,000个训练图像和10,000个测试图像。每个图像都是28x28像素的灰度图像,表示手写数字0到9。我们将使用PyTorch内置的torchvision.datasets模块来加载MNIST数据集。下面是一个示例:

import torch
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 定义数据预处理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

# 加载MNIST数据集
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 = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)

在这个示例中,我们首先定义了一个名为transform的数据预处理管道,该管道将图像转换为PyTorch张量,并对每个像素进行归一化。然后,我们使用datasets.MNIST类加载MNIST数据集,并使用transform参数将数据预处理应用于每个图像。我们还定义了两个数据加载器,一个用于训练数据,一个用于测试数据。每个数据加载器将数据分成大小为64的批次,并在每个时期之间打乱数据。

模型训练

我们将使用一个简单的卷积神经网络(CNN)来训练我们的模型。CNN是一种特殊的神经网络,它可以有效地处理图像数据。我们将使用PyTorch内置的torch.nn模块来定义CNN模型。下面是一个示例:

import torch.nn as nn
import torch.nn.functional as F

# 定义CNN模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.dropout1 = nn.Dropout2d(0.25)
        self.dropout2 = nn.Dropout2d(0.5)
        self.fc1 = nn.Linear(64 * 7 * 7, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2)
        x = self.dropout1(x)
        x = torch.flatten(x, 1)
        x = F.relu(self.fc1(x))
        x = self.dropout2(x)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

# 定义优化器和损失函数
model = Net()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
criterion = nn.CrossEntropyLoss()

在这个示例中,我们首先定义了一个名为Net的CNN模型。该模型包含两个卷积层、两个dropout层和两个全连接层。我们使用nn.Conv2d类定义卷积层,使用nn.Dropout2d类定义dropout层,使用nn.Linear类定义全连接层。在forward方法中,我们使用F.relu函数对卷积层的输出进行非线性变换,使用F.max_pool2d函数对特征图进行下采样,使用torch.flatten函数将特征图展平为一维张量,使用F.log_softmax函数将输出转换为概率。然后,我们使用torch.optim.SGD类定义优化器,并使用nn.CrossEntropyLoss类定义损失函数。

接下来,我们将使用训练数据对模型进行训练。在每个时期中,我们将模型应用于每个批次的数据,并使用反向传播算法更新模型的权重。下面是一个示例:

# 训练模型
for epoch in range(10):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

    # 在测试数据上评估模型
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            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('Epoch: {} Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)'.format(
        epoch, test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

在这个示例中,我们首先使用model.train()方法将模型设置为训练模式。然后,我们使用enumerate函数遍历训练数据加载器中的每个批次,并使用optimizer.zero_grad()方法清除梯度。接下来,我们使用模型对数据进行预测,并使用criterion计算损失。然后,我们使用loss.backward()方法计算梯度,并使用optimizer.step()方法更新模型的权重。

在每个时期结束时,我们使用model.eval()方法将模型设置为评估模式,并使用torch.no_grad()上下文管理器禁用梯度计算。然后,我们使用测试数据加载器对模型进行评估,并计算平均损失和准确率。最后,我们打印出每个时期的平均损失和准确率。

第二部分:模型测试和结果分析

模型测试

在第一部分中,我们训练了一个CNN模型,并使用测试数据对其进行了评估。现在,我们将使用该模型对一些手写数字图像进行分类。下面是一个示例:

import matplotlib.pyplot as plt
import numpy as np

# 加载手写数字图像
image = plt.imread('test_image.png')
image = np.mean(image, axis=2)
image = 1 - image / 255.0
image = np.expand_dims(image, axis=0)
image = np.expand_dims(image, axis=0)

# 使用模型对图像进行分类
model.eval()
with torch.no_grad():
    output = model(torch.from_numpy(image).float())
    pred = output.argmax(dim=1, keepdim=True)

# 打印预测结果
print('Prediction:', pred.item())

在这个示例中,我们首先使用matplotlib.pyplot.imread函数加载手写数字图像,并使用numpy.mean函数将图像转换为灰度图像。然后,我们使用1 - image / 255.0将像素值归一化到0到1之间,并使用np.expand_dims函数将图像转换为PyTorch张量的形状。接下来,我们使用训练好的模型对图像进行分类,并使用output.argmax函数找到输出中最大值的索引。最后,我们打印出预测结果。

结果分析

我们可以使用混淆矩阵来分析模型的分类结果。混淆矩阵是一个表格,其中行表示实际类别,列表示预测类别。对角线上的元素表示正确分类的样本数,非对角线上的元素表示错误分类的样本数。下面是一个示例:

from sklearn.metrics import confusion_matrix

# 在测试数据上评估模型
model.eval()
test_loss = 0
correct = 0
y_true = []
y_pred = []
with torch.no_grad():
    for data, target in test_loader:
        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()
        y_true.extend(target.numpy())
        y_pred.extend(pred.numpy().flatten())

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

# 计算混淆矩阵
cm = confusion_matrix(y_true, y_pred)
print(cm)

在这个示例中,我们首先定义了两个空列表y_truey_pred,用于存储测试数据的实际标签和预测标签。然后,我们使用测试数据加载器对模型进行评估,并计算平均损失和准确率。在评估过程中,我们使用extend方法将每个批次的实际标签和预测标签添加到列表中。最后,我们使用sklearn.metrics.confusion_matrix函数计算混淆矩阵,并打印出结果。

混淆矩阵可以帮助我们了解模型在每个类别上的性能。例如,如果模型在某个类别上的准确率很低,我们可以尝试增加该类别的训练数据或调整模型的超参数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch实现手写数字图片识别 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • pytorch索引与切片

    @ 目录 index索引 基本索引 连续选取 规则间隔索引 索引总结 不规则间隔索引 任意多的维度索引 使用掩码来索引 打平后的索引 index索引 torch会自动从左向右索引 例子: a = torch.randn(4,3,28,28) 表示类似一个CNN 的图片的输入数据,4表示这个batch一共有4张照片,而3表示图片的通道数为3(RGB),(28,…

    PyTorch 2023年4月6日
    00
  • pytorch模型存储的2种实现方法

    在PyTorch中,我们可以使用两种方法来存储模型:state_dict和torch.save。以下是两个示例说明。 示例1:使用state_dict存储模型 import torch import torch.nn as nn # 定义模型 class Net(nn.Module): def __init__(self): super(Net, self)…

    PyTorch 2023年5月16日
    00
  • PyTorch Distributed Data Parallel使用详解

    在PyTorch中,我们可以使用分布式数据并行(Distributed Data Parallel,DDP)来加速模型的训练。在本文中,我们将详细讲解如何使用DDP来加速模型的训练。我们将使用两个示例来说明如何完成这些步骤。 示例1:使用单个节点的多个GPU训练模型 以下是使用单个节点的多个GPU训练模型的步骤: import torch import to…

    PyTorch 2023年5月15日
    00
  • Pytorch 数据加载与数据预处理方式

    PyTorch 数据加载与数据预处理方式 在PyTorch中,数据加载和预处理是深度学习中非常重要的一部分。本文将介绍PyTorch中常用的数据加载和预处理方式,包括torch.utils.data.Dataset、torch.utils.data.DataLoader、数据增强和数据标准化等。 torch.utils.data.Dataset torch.…

    PyTorch 2023年5月15日
    00
  • 详解Pytorch+PyG实现GAT过程示例

    GAT(Graph Attention Network)是一种用于图神经网络的模型,它可以对节点进行分类、回归等任务。在PyTorch和PyG中,我们可以使用GAT来构建图神经网络模型。下面是两个示例说明如何使用PyTorch和PyG实现GAT过程。 示例1 假设我们有一个包含10个节点和20条边的图,我们想要使用GAT对节点进行分类。我们可以使用以下代码来…

    PyTorch 2023年5月15日
    00
  • pytorch1.0中torch.nn.Conv2d用法详解

    torch.nn.Conv2d是PyTorch中用于实现二维卷积操作的类。在本文中,我们将详细介绍torch.nn.Conv2d的用法,并提供两个示例。 1. torch.nn.Conv2d的参数 torch.nn.Conv2d的参数如下: torch.nn.Conv2d(in_channels, out_channels, kernel_size, str…

    PyTorch 2023年5月16日
    00
  • pytorch之维度变化view/reshape;squeeze/unsqueeze;Transpose/permute;Expand/repeat

    ————恢复内容开始———— 概括:      一. view/reshape      作用几乎一模一样,保证size不变:意思就是各维度相乘之积相等(numel()),且具有物理意义,别瞎变,要不然破坏数据污染数据;     数据的存储、维度顺序非常重要,需要时刻记住            size没有保持固定住,报错  …

    PyTorch 2023年4月7日
    00
  • pytorch分类模型绘制混淆矩阵以及可视化详解

    以下是关于“pytorch分类模型绘制混淆矩阵以及可视化详解”的完整攻略,其中包含两个示例说明。 示例1:绘制混淆矩阵 步骤1:导入必要的库 在绘制混淆矩阵之前,我们需要导入一些必要的库,包括numpy、matplotlib和sklearn。 import numpy as np import matplotlib.pyplot as plt from sk…

    PyTorch 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部