Python实战小项目之Mnist手写数字识别

 更新时间:2021年10月20日 15:01:10   作者:GSAU-深蓝工作室  
MNIST 数据集已经是一个被”嚼烂”了的数据集, 很多教程都会对它”下手”, 几乎成为一个 “典范”. 不过有些人可能对它还不是很了解, 下面通过一个小实例来带你了解它

程序流程分析图:

传播过程:

代码展示:

创建环境

使用<pip install+包名>来下载torch,torchvision包

准备数据集

设置一次训练所选取的样本数Batch_Sized的值为512,训练此时Epochs的值为8

BATCH_SIZE = 512
EPOCHS = 8
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

下载数据集

Normalize()数字归一化,转换使用的值0.1307和0.3081是MNIST数据集的全局平均值和标准偏差,这里我们将它们作为给定值。model

train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('data', train=True, download=True,
                   transform=transforms.Compose([.
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=BATCH_SIZE, shuffle=True)

下载测试集

test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('data', train=False,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=BATCH_SIZE, shuffle=True)

绘制图像

我们可以使用matplotlib来绘制其中的一些图像

examples = enumerate(test_loader)
batch_idx, (example_data, example_targets) = next(examples)
print(example_targets)
print(example_data.shape)
print(example_data)
 
import matplotlib.pyplot as plt
fig = plt.figure()
for i in range(6):
  plt.subplot(2,3,i+1)
  plt.tight_layout()
  plt.imshow(example_data[i][0], cmap='gray', interpolation='none')
  plt.title("Ground Truth: {}".format(example_targets[i]))
  plt.xticks([])
  plt.yticks([])
plt.show()

搭建神经网络

这里我们构建全连接神经网络,我们使用三个全连接(或线性)层进行前向传播。

class linearNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, 10)
    def forward(self, x):
        x = x.view(-1, 784)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.fc2(x)
        x = F.relu(x)
        x = self.fc3(x)
        x = F.log_softmax(x, dim=1)
        return x

训练模型

首先,我们需要使用optimizer.zero_grad()手动将梯度设置为零,因为PyTorch在默认情况下会累积梯度。然后,我们生成网络的输出(前向传递),并计算输出与真值标签之间的负对数概率损失。现在,我们收集一组新的梯度,并使用optimizer.step()将其传播回每个网络参数。

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 = F.nll_loss(output, target)
        loss.backward()
        optimizer.step()
        if (batch_idx) % 30 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                       100. * batch_idx / len(train_loader), loss.item()))

测试模型

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 += F.nll_loss(output, target, reduction='sum').item() # 将一批的损失相加
            pred = output.max(1, keepdim=True)[1] # 找到概率最大的下标
            correct += pred.eq(target.view_as(pred)).sum().item()
 
    test_loss /= len(test_loader.dataset)
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

将训练次数进行循环

if __name__ == '__main__':
    model = linearNet()
    optimizer = optim.Adam(model.parameters())
 
    for epoch in range(1, EPOCHS + 1):
        train(model, device, train_loader, optimizer, epoch)
        test(model, device, test_loader)

保存训练模型

torch.save(model, 'MNIST.pth')

运行结果展示:

分享人:苏云云

到此这篇关于Python实战小项目之Mnist手写数字识别的文章就介绍到这了,更多相关Python Mnist手写数字识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python如何使用内置库matplotlib绘制折线图

    Python如何使用内置库matplotlib绘制折线图

    这篇文章主要介绍了Python如何使用内置库matplotlib绘制折线图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python超简单分析评论提取关键词制作精美词云流程

    Python超简单分析评论提取关键词制作精美词云流程

    这篇文章主要介绍了使用Python来分析评论并且提取其中的关键词,用于制作精美词云的方法,感兴趣的朋友来看看吧
    2022-03-03
  • Python标准库之os模块详解

    Python标准库之os模块详解

    Python的os模块是用于与操作系统进行交互的模块,它提供了许多函数和方法来执行文件和目录操作、进程管理、环境变量访问等,本文详细介绍了Python标准库中os模块,感兴趣的同学跟着小编一起来看看吧
    2023-08-08
  • PyTorch的Optimizer训练工具的实现

    PyTorch的Optimizer训练工具的实现

    这篇文章主要介绍了PyTorch的Optimizer训练工具的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Pandas Query方法使用深度总结

    Pandas Query方法使用深度总结

    大多数Pandas用户都熟悉iloc[]和loc[]索引器方法,用于检索行和列。但是随着检索数据的规则变得越来越复杂,这些方法也随之变得更加复杂而臃肿。本文将展示如何使用 query() 方法对数据框执行查询,感兴趣的可以了解一下
    2022-07-07
  • Python实现插入排序和选择排序的方法

    Python实现插入排序和选择排序的方法

    这篇文章主要介绍了Python实现插入排序和选择排序的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 解决python的空格和tab混淆而报错的问题

    解决python的空格和tab混淆而报错的问题

    这篇文章主要介绍了解决python的空格和tab混淆而报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • python:HDF和CSV存储优劣对比分析

    python:HDF和CSV存储优劣对比分析

    这篇文章主要介绍了python:HDF和CSV存储优劣对比分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python面向对象总结及类与正则表达式详解

    Python面向对象总结及类与正则表达式详解

    Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。这篇文章主要介绍了Python面向对象总结及类与正则表达式 ,需要的朋友可以参考下
    2019-04-04
  • Python cv2 图像自适应灰度直方图均衡化处理方法

    Python cv2 图像自适应灰度直方图均衡化处理方法

    今天小编就为大家分享一篇Python cv2 图像自适应灰度直方图均衡化处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12

最新评论