Pytorch深度学习——用卷积神经网络实现MNIST数据集分类

使用PyTorch实现卷积神经网络(CNN),对MNIST数据集中的手写数字进行分类 这是一个使用PyTorch实现的卷积神经网络(CNN),用于对MNIST数据集中的手写数字进行分类。该网络由两个卷积层组成,其中间有ReLU激活函数和最大池化层。第一个卷积层有16个过滤器,过滤器大小为5x5,填充为2,以保持输出大小与输入相同。第二个卷积层有32个过滤器,与第一个卷积层具有相同的过滤器大小和填充。在第二个卷积层之后,输出被展平,并通过具有10个输出神经元的全连接层传递,对应于10个可能的数字。从全连接层的输出经过softmax激活函数,以获得最终分类概率。 阅读详情
AI摘要

本文介绍使用卷积神经网络(CNN)对手写数字数据集MNIST进行分类识别的过程。通过搭建包含两个卷积层、最大池化及全连接层的模型,并采用PyTorch实现训练与测试。最终,在测试集上取得良好的准确率。

目录

1 准备数据集

2 建立模型

3 构造损失函数+优化器

4 训练+测试

5 完整代码+运行结果


 选择下图结构的卷积神经网络来进行训练:

 

步骤:

  1. 选择 5 x 5 的卷积核,输入通道为 1,输出通道为 10:此时图像矩阵经过 5 x 5 的卷积核后会小两圈,也就是4个数位,变成 24 x 24,输出通道为10;
  2. 选择 2 x 2 的最大池化层:此时图像大小缩短一半,变成 12 x 12,通道数不变;
  3. 再次经过 5 x 5 的卷积核,输入通道为 10,输出通道为 20:此时图像再小两圈,变成 8 *8,输出通道为20;
  4. 再次经过 2 x 2 的最大池化层:此时图像大小缩短一半,变成 4 x 4,通道数不变;
  5. 最后将图像整型变换成向量,输入到全连接层中:输入一共有 4 x 4 x 20 = 320 个元素,输出为 10.

具体代码如下:

1 准备数据集

# 准备数据集
batch_size = 64
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])
train_dataset = datasets.MNIST(root='../dataset/mnist/',
                               train=True,
                               download=True,
                               transform=transform)
train_loader = DataLoader(train_dataset,
                          shuffle=True,
                          batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist',
                              train=False,
                              download=True,
                              transform=transform)
test_loader = DataLoader(test_dataset,
                         shuffle=False,
                         batch_size=batch_size)

2 建立模型

class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)
        self.pooling = torch.nn.MaxPool2d(2)
        self.fc = torch.nn.Linear(320, 10)

    def forward(self, x):
        batch_size = x.size(0)
        x = F.relu(self.pooling(self.conv1(x)))
        x = F.relu(self.pooling(self.conv2(x)))
        x = x.view(batch_size, -1)
        x = self.fc(x)
        return x


model = Net()
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)

3 构造损失函数+优化器

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

4 训练+测试

def train(epoch):
    running_loss = 0.0
    for batch_idx, data in enumerate(train_loader, 0):
        inputs, target = data
        inputs,target=inputs.to(device),target.to(device)
        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, target)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if batch_idx % 300 == 299:
            print('[%d,%.5d] loss:%.3f' % (epoch + 1, batch_idx + 1, running_loss / 2000))
            running_loss = 0.0

def test():
    correct=0
    total=0
    with torch.no_grad():
        for data in test_loader:
            inputs,target=data
            inputs,target=inputs.to(device),target.to(device)
            outputs=model(inputs)
            _,predicted=torch.max(outputs.data,dim=1)
            total+=target.size(0)
            correct+=(predicted==target).sum().item()
    print('Accuracy on test set:%d %% [%d%d]' %(100*correct/total,correct,total))

if __name__ =='__main__':
    for epoch in range(10):
        train(epoch)
        test()

5 完整代码+运行结果

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

# 准备数据集
batch_size = 64
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])
train_dataset = datasets.MNIST(root='../dataset/mnist/',
                               train=True,
                               download=True,
                               transform=transform)
train_loader = DataLoader(train_dataset,
                          shuffle=True,
                          batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist',
                              train=False,
                              download=True,
                              transform=transform)
test_loader = DataLoader(test_dataset,
                         shuffle=False,
                         batch_size=batch_size)


class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)
        self.pooling = torch.nn.MaxPool2d(2)
        self.fc = torch.nn.Linear(320, 10)

    def forward(self, x):
        batch_size = x.size(0)
        x = F.relu(self.pooling(self.conv1(x)))
        x = F.relu(self.pooling(self.conv2(x)))
        x = x.view(batch_size, -1)
        x = self.fc(x)
        return x


model = Net()
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)

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


def train(epoch):
    running_loss = 0.0
    for batch_idx, data in enumerate(train_loader, 0):
        inputs, target = data
        inputs,target=inputs.to(device),target.to(device)
        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, target)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if batch_idx % 300 == 299:
            print('[%d,%.5d] loss:%.3f' % (epoch + 1, batch_idx + 1, running_loss / 2000))
            running_loss = 0.0

def test():
    correct=0
    total=0
    with torch.no_grad():
        for data in test_loader:
            inputs,target=data
            inputs,target=inputs.to(device),target.to(device)
            outputs=model(inputs)
            _,predicted=torch.max(outputs.data,dim=1)
            total+=target.size(0)
            correct+=(predicted==target).sum().item()
    print('Accuracy on test set:%d %% [%d%d]' %(100*correct/total,correct,total))

if __name__ =='__main__':
    for epoch in range(10):
        train(epoch)
        test()

运行结果如下:

 

 

MNIST数字分类——使用卷积神经网络 简介 关于使用Dense层(密集连接型网络)处理MNIST数字图像分类的问题,可以参考使用keras构建和训练mnist的神经网络。 卷积神经网络,是计算机视觉领域使用最广泛的一种深度学习模型。可以对比,使用简单的卷积神经网络,即可达到比使用Dense层模型精确度更高的模型。 与密集连接层不同,卷积层学到的是图像的局部模式,而Dense层是从输入空间中学习全局模式。 这个重要特性使用卷积神经网络具有以下特点: 学习到模式具有平移不变性,这使得它可以在图像的任意位置识别该模式,能够高效利用数据,只需要更少 阅读详情

相关推荐

神经网络实战:用PyTorch从零实现BP、MLP与CNN

神经网络本质上是万能函数逼近器,通过大量参数组合自动学习复杂非线性关系。反向传播算法作为训练核心,让误差从输出层逐层传递并更新权重,而多层感知机(MLP)与卷积神经网络(CNN)则是两种最基础也最常用的网络结构。从张量、激活函数、损失函数到优化器,深度学习的代码实现有一套标准训练闭环:前向传播、计算损失、梯度清零、反向传播、参数更新。理解这些概念后,就能用PyTorch快速搭建图像分类模型。本文面向深度学习入门者与工程实践者,从BP网络分类月亮数据集开始,逐步过渡到MLP识别手写数字、CNN处理CIFAR-

weixin_34242331的博客 785

【深度学习实战】使用卷积神经网络(LeNet-5)对mnist数据集进行多分类

【代码】【深度学习实战】使用卷积神经网络(LeNet-5)对mnist数据集进行多分类。

在热爱技术的路上一直前行。 1194

深度学习入门:揭开神经网络的神秘面纱(附PyTorch实战)

print('预测结果: ', ' '.join(f'{classes[predicted[j]]}' for j in range(4)))print('真实标签: ', ' '.join(f'{classes[labels[j]]}' for j in range(4)))self.conv2 = nn.Conv2d(32, 64, 3) # 输入通道32,输出通道64,卷积核3x3。self.conv1 = nn.Conv2d(1, 32, 3) # 输入通道1,输出通道32,卷积核3x3。

wu_jing_sheng0的专栏 1180

基于Python实现的卷积神经网络分类MNIST数据集

本文介绍了使用卷积神经网络(CNN)分类MNIST数据集的方法。首先概述了CNN的基本原理,包括卷积层、池化层和全连接层的功能,以及局部连接、权值共享和池化等关键技术。然后详细说明了网络模型的构建过程,包含两层卷积+池化结构和两层全连接层,并给出了使用TensorFlow实现的代码。实验结果表明,CNN在MNIST数据集上取得了较好的分类效果,运行时间约为3分钟,准确率较高。与BP神经网络相比,CNN通过局部连接和权值共享显著减少了参数量,同时利用池化操作实现了数据降维,有效提升了分类性能。

毕业作品网站 7128

[Python从零到壹] 六十七.图像识别及经典案例篇之基于卷积神经网络的MNIST图像分类

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍。图像分类是根据图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。上一篇文章主要讲解常见的图像分类算法,并介绍了Python环境下的贝叶斯图像分类算法和基于KNN算法的图像分类等案例。这篇文章将利用卷积神经网络实现MNIST(手写数字)图像分类,这也是经典的图像分类案例。希望文章对您有所帮助,如果有不足之处,还请海涵。

杨秀璋的专栏 3898

手写数字识别数据集MNIST深度学习实战项目

手写数字识别作为深度学习的入门任务,其标准数据集MNIST由Yann LeCun等人于1998年发布,包含60,000个训练图像和10,000个测试图像,每张图像为28×28像素的灰度图,对应0–9的数字标签。数据集具有良好的类别均衡性(每类约6,000训练样本),便于模型评估与调试。在实际应用中,可通过PyTorch或TensorFlow等框架直接加载内置MNIST数据,亦可手动解压mnist.zip并转换为张量格式。# 示例:使用PyTorch加载MNIST数据集该代码自动下载并封装数据为。

weixin_36123300的博客 863

深度学习入门:用PyTorch实现卷积神经网络

本文介绍了如何使用PyTorch实现一个简单的卷积神经网络(CNN)进行图像分类任务。首先,文章概述了CNN的基本概念,包括卷积层、池化层、全连接层和激活函数等核心组件。接着,详细讲解了PyTorch的安装和基本操作,如张量的创建和自动求导功能。随后,通过一个实战案例,展示了如何使用PyTorch构建、训练和评估一个简单的CNN模型,应用于MNIST数据集的分类任务。文章最后总结了CNN在图像识别中的优势以及PyTorch作为深度学习框架的灵活性和适用性。

2501_91624122的博客 1019

深度学习基础网络模型实战:MNIST手写体识别

深度学习是机器学习的一个重要分支,其核心在于通过多层次的神经网络模型自动提取数据的深层特征。一个基本的神经网络由输入层、隐藏层和输出层组成,每一层通过激活函数实现非线性映射,从而增强模型的表达能力。在图像识别领域,深度学习通过卷积神经网络(CNN)等结构实现了对图像特征的高效提取与分类。本章将围绕深度学习的基本模型展开,重点探讨其在MNIST手写数字识别任务中的应用,为后续模型构建与优化奠定理论基础。

weixin_35433448的博客 935

深度学习笔记(2)——pytorch实现MNIST数据集分类(FNN、CNN、RNN、LSTM、GRU)

快开学了,花了一个晚上时间复习深度学习基础代码,复习了最基础的MNIST手写数字识别数据集分类,使用FNN、CNN、RNN、LSTM、GRU实现。

m0_46275020的博客 3158

Pytorch入门:MNIST数据集手写数字分类指南

PyTorch是一个开源的机器学习库,提供了一种灵活的框架,使得研究人员和开发人员可以轻松地实现复杂的神经网络架构。自2016年由Facebook推出以来,PyTorch已经迅速成为了深度学习领域里最受欢迎的库之一,它之所以备受欢迎,主要归功于它的动态计算图和易用性。手写数字识别是计算机视觉领域的经典问题,具有广泛的应用场景。从邮政编码的自动识别,到银行支票数字的验证,再到各种电子设备中数字的输入,手写数字识别技术在日常生活中扮演着不可或缺的角色。

weixin_36238982的博客 1154

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 344

彻底搞懂一个算法,CNN!!

如果你真的想学习人工智能,请不要去网上找那些零零碎碎的教程,真的很难学懂!你可以根据我这个学习路线和系统资料,制定一套学习计划,只要你肯花时间沉下心去学习,它们一定能帮到你!

Gupao123的博客 856

VCS2018在Ubuntu20 18安装步骤

之前在Ubuntu20上下VCS,花了好几天时间,本来想写博客避免以后重复劳动。但由于各种原因拖了一两个月,这次由于疫情原因,期末考试推迟,所以就再次在Ubuntu18上下了VCS,顺便写博客记录。 以下VCS2018安装方法适用于 Ubuntu20、Ubuntu18,亲测可用。其他Linux发行版没试过,但应该步骤差不多。 文章目录安装包安装步骤1、建立安装路径,更改权限2、运行安装器进行安装3、生成License文件4、设置环境变量5、验证License6、启动lmgrd验证软件是否安装成功dvever

s-stone的博客 3万+

Pytorch学习(一)一些基础认识

Pytorch学习(一)相关教程文档Tensor张量对Tensor的认识Tensor的常用基本操作Autograd自动微分对Autograd的认识Autograd的内部机理简单的神经网络CNN对神经网络CNN的简单认识定义网络 相关教程文档 Pytorch官方教程传送门 PyTorch中文文档传送门 参考博文Zen_君的简书 Tensor张量 对Tensor的认识 其实标量,向量,矩阵它们三个也是张量,标量是零维的张量,向量是一维的张量,矩阵是二维的张量。 张量就是按照任意维排列的一堆数字的推广。如图所示,

weixin_42835514的博客 532

全本地AI代理实战:零数据外泄的本地化Agent工作流搭建

全本地AI代理是一种将大语言模型推理、长期记忆与工具调用完全运行于用户本地设备的智能体架构,其核心原理在于通过进程隔离与标准化协议实现模型层、记忆层和工具层的解耦协同。相比依赖云端API的传统方案,它在数据主权、响应确定性与环境复现性上具备不可替代的技术价值。典型应用场景包括法务合规文档处理、离线工业现场辅助决策、以及高敏感度企业知识管理。本文聚焦Qwen2+Ollama+SurrealDB+Agno技术栈,详解如何构建可落地的全本地AI代理系统,覆盖从硬件适配、向量记忆建模到多模态插件协同的完整链路。

weixin_34194964的博客 650

工业激光器核心参数详解与选型实战:从理论到产线落地(五)

本文深入解析了脉冲激光加工的三大核心参数——脉宽、重复频率和脉冲能量的协同作用机制。通过公式推导和产线案例,揭示了参数设置对加工良率的关键影响:1. 脉宽决定热影响区大小,缩短脉宽可显著提升加工精度;2. 重复频率影响加工速度和热积累效应,需平衡效率与质量;3. 脉冲能量决定材料去除量,过大易导致加工缺陷。文中以ABS塑料打标、模具清洗和微孔钻孔为例,展示了参数优化如何将良率从65%提升至99%,并提供了不同应用场景的参数选型表和调试技巧,强调峰值功率比平均功率更具决定性作用。

weixin_44520581的博客 2421

PyTorch实现TPU版本CNN模型

作者|DR. VAIBHAV KUMAR 编译|VK 来源|Analytics In Diamag 随着深度学习模型在各种应用中的成功实施,现在是时候获得不仅准确而且速度更快的结果。 为了得到更准确的结果,数据的大小是非常重要的,但是当这个大小影响到机器学习模型的训练时间时,这一直是一个值得关注的问题。 为了克服训练时间的问题,我们使用TPU运行时环境来加速训练。为此,PyTorch一直在通过提供最先进的硬件加速器来支持机器学习的实现。 PyTorch对云TPU的支持是通过与XLA(加速线性代数)的集成实现

TensorFlowNews 1716

【华为OD机试真题】4、字符统计及重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数, 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前

KJ.JK 3289

pytorch .item_pytorch快速入门:从Hello World 到 Bert

最近pytorch越来越流行,以上手快、实现算法效率高等特点被很多人喜欢,尤其是在学术圈的使用率越来越高,很多大佬的开源代码都是pytorch的,反正早晚都要学,不如现在就跟我一起花半个小时入门,学到即赚到。1.什么是pytorch?pytorch是Facebook人工智能研究院开源的机器学习开源框架,它有两个基本使用场景:1. 作为NumPy的替代品,可以使用GPU的强大计算能力.2. 提供最大...

weixin_39610759的博客 145

SI案例分享--考虑ESD保护二极管的差分线阻抗仿真

PCB设计中的cut out参考面早已是SI评估中常用的阻抗优化方式,通过合理的仿真建模,可以提供合适的设计参考,并保持与测试结果的高度一致性。

一只豌豆象的博客 1437

JavaFX Stage

JavaFXStagejavafx.stage.Stage表示 JavaFX 桌面应用程序中的窗口。在 JavaFX 内部,Stage您可以插入一个 JavaFX Scene,它表示在窗口内显示的内容 - 在Stage.当 JavaFX 应用程序启动时,它会创建一个根Stage对象,该对象将传递给 start(Stage primaryStage)JavaFX 应用程序的根类的方法。此Stage 对象代表 JavaFX 应用程序的主窗口。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 508

手把手教你用CNN实现MNIST手写数字识别——深度学习入门(1)

本文介绍了一个基于PyTorch的MNIST手写数字识别实战项目。主要内容包括:1. 选用MNIST数据集的原因分析,包括数据质量高、特征复杂度适中等优势;2. 环境配置与GPU加速设置;3. 数据预处理详解,对比Tensor转换、PIL图像和NumPy数组三种格式差异;4. 数据加载器(DataLoader)的配置与优化技巧。项目通过可视化分析和代码实践,帮助深度学习新手掌握图像分类任务的基本流程和方法论,为后续复杂任务打下基础。

Meraki____的博客 813

实现画布拖拽算子排布,通过flink实现算子编排计算,如何实现?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1072

pytorch 三维点分类_pytorch实现简单的分类器

作为目前越来越受欢迎的深度学习框架,pytorch 基本上成了新人进入深度学习领域最常用的框架。相比于 TensorFlow,pytorch 更易学,更快上手,也可以更容易的实现自己想要的 demo。今天的文章就从 pytorch 的基础开始,帮助大家实现成功入门。首先,本篇文章需要大家对深度学习的理论知识有一定的了解,知道基本的 CNN,RNN 等概念,知道前向传播和反向传播等流程,毕竟本文重点...

weixin_39634884的博客 446

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

告别“纸上谈兵”:用PyTorch实战MNIST,构建你的第一个深度学习模型

摘要:本文介绍了使用PyTorch实现MNIST手写数字分类的完整流程。文章详细讲解了数据预处理、构建SimpleCNN模型(包含卷积层、池化层和全连接层)、训练循环和验证循环的实现。代码使用Adam优化器、交叉熵损失函数和学习率调度器,进行了30轮训练,并保存验证准确率最高的模型。整个流程涵盖了数据加载、模型定义、训练验证和结果保存等关键步骤,为初学者提供了完整的PyTorch分类任务实现

w123456789ABCDEF的博客 881

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Pytorch 手写数字识别 深度学习基础分享

本篇是一次内部分享,给项目开发的同事分享什么是深度学习。用最简单的手写数字识别做例子,讲解了大概的原理。

金色旭光的博客 1259

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: Pytorch深度学习——用全连接神经网络实现MNIST数据集分类
下一篇: Pytorch深度学习—— 自己设计模型训练MNIST(B站刘二大人P10作业)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习CV的研一小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值