Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用卷积网络做手写数字识别

使用卷积网络做手写数字识别

原创
作者头像
卡尔曼和玻尔兹曼谁曼
发布于 2019-03-03 04:10:00
发布于 2019-03-03 04:10:00
7360
举报

版权声明:本文为博主原创文章,转载请注明原文出处!

写作时间:2019-03-02 22:24:22

使用卷积网络做手写数字识别

思路分析

上篇博文《使用循环神经网络做手写数字识别》介绍了利用LSTM做手写数字的识别,想着好事成双,也写一个姊妹篇卷积网络实现手写数字的识别。

博文主要通过最简单的代码量展示一个入门级别的识别案例。需要注意的几点:

  • 卷积网络的输入大小为(batch_sizenum_channelsimage_widthimage_height
  • 本文中的模型使用了卷积层和线性连接层。Linear层的输入大小为(*num_input_feature),所以在卷积层输出流入线性层的时候,需要转化一下张量的尺寸大小
  • 综合使用MaxPooling层和Dropout层可以提高识别准确率

PyTorch实现

代码语言:txt
AI代码解释
复制
import torch
from torch import nn
import torchvision.datasets as datasets
import torchvision.transforms as transforms

torch.manual_seed(2019)

# 超参设置
EPOCH = 1  # 训练EPOCH次,这里为了测试方便只跑一次
BATCH_SIZE = 32
INIT_LR = 1e-3  # 初始学习率
DOWNLOAD_MNIST = True  # 设置是否需要下载数据集

# 使用DataLoader加载训练数据,为了演示方便,对于测试数据只取出2000个样本进行测试
train_data = datasets.MNIST(root='mnist', train=True, transform=transforms.ToTensor(), download=DOWNLOAD_MNIST)
train_loader = torch.utils.data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)
test_data = datasets.MNIST(root='mnist', train=False)
test_x = test_data.test_data.type(torch.FloatTensor)[:2000] / 255.
test_x.unsqueeze_(1)  # 调整test_x的尺寸为四维,添加了一个channel维度
test_y = test_data.test_labels.numpy()[:2000]


class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(1, 32, 5),  # 图像输出大小为24*24
            nn.MaxPool2d(2),  # 图像输出大小为12*12
            nn.ReLU(True),
            nn.Conv2d(32, 64, 5),  # 图像输出大小为8*8
            nn.Dropout2d(),
            nn.MaxPool2d(2),  # 图像输出大小为4*4
            nn.ReLU(True)
        )

        self.linear = nn.Sequential(
            nn.Linear(4 * 4 * 64, 128),
            nn.ReLU(True),
            nn.Dropout2d(),
            nn.Linear(128, 10),
            nn.Softmax(1)
        )

    def forward(self, x):
        x = self.conv(x)
        x = x.view(-1, 4 * 4 * 64)
        out = self.linear(x)
        return out


model = ConvNet()
print(model)

optimizer = torch.optim.Adam(model.parameters(), lr=INIT_LR)
loss_func = nn.CrossEntropyLoss()

# RNN训练
for epoch in range(EPOCH):
    for index, (b_x, b_y) in enumerate(train_loader):
        model.train()
        # 输入尺寸为(batch_size, channels, height, width)
        output = model(b_x)  # (64, 1, 28, 28)
        loss = loss_func(output, b_y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if index % 50 == 0:
            model.eval()
            prediction = model(test_x)  # 输出为(2000, 10)
            pred_y = torch.max(prediction, 1)[1].data.numpy()
            accuracy = (pred_y == test_y).sum() / float(test_y.size)
            print(f'Epoch: [{index}/{epoch}]', f'| train loss: {loss.item()}', f'| test accuracy: {accuracy}')

# 打印测试数据集中的后20个结果
model.eval()
prediction = model(test_x[:20])
pred_y = torch.max(prediction, 1)[1].data.numpy()
print(pred_y, 'prediction number')
print(test_y[:20], 'real number')

训练结果如下,可以看到对于这种不太复杂的问题,CNN和RNN都可以得到比较高的精度。

使用卷积网络做手写数字识别
使用卷积网络做手写数字识别

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用循环神经网络做手写数字识别
做图像识别的使用卷积神经网络CNN是最好的选择,但是其实我们也可以使用循环神经网络RNN做,只是大部分时候没有卷积网络效果好!下面分析一下如何使用RNN做手写数字的识别。
卡尔曼和玻尔兹曼谁曼
2019/03/03
1.3K0
使用循环神经网络做手写数字识别
基于MNIST数据集的实现手写数字识别
创建workspace文件夹,文件夹下创建基于 Python3 的 .ipynb 程序。
Damon小智
2024/08/12
2940
基于MNIST数据集的实现手写数字识别
MNIST手写数字识别
掌握利用卷积神经网络CNN实现对MNIST手写数字的识别。一个简单的神经网络实验
不去幼儿园
2024/12/03
4420
MNIST手写数字识别
CNN使用MNIST手写数字识别实战的代码和心得
因为MNIST图片为长和宽相同的28像素,为黑白两色,所以图片的高度为1,为灰度通道。
flykiss
2021/09/13
1.7K0
PyTorch深度学习框架入门——使用PyTorch实现手写数字识别
Pytorch是目前非常流行的深度学习框架,因为它具备了Python的特性所以极易上手和使用,同时又兼具了NumPy的特性,因此在性能上也并不逊于任何一款深度学习框架。现在PyTorch又和Caffe2进行了融合,在今年暑期整和了Caffe2的PyTorch1.0版本将受到更多专业人士的关注和重视。下面我们通过使用PyTorch实现一个手写数字识别的模型来简单的入门一下PyTorch。
Python中文社区
2018/07/26
2K0
PyTorch深度学习框架入门——使用PyTorch实现手写数字识别
手写数字识别基本思路
问题 什么是MNIST?如何使用Pytorch实现手写数字识别?如何进行手写数字对模型进行检验? 方法 mnist数据集 MNIST数据集是美国国家标准与技术研究院收集整理的大型手写数字数据集,包含
算法与编程之美
2023/08/22
3150
手写数字识别基本思路
用PyTorch实现MNIST手写数字识别(非常详细)
MNIST可以说是机器学习入门的hello word了!导师一般第一个就让你研究MNIST,研究透了,也算基本入门了。好的,今天就来扯一扯学一学。
小锋学长生活大爆炸
2020/08/13
2.1K0
用PyTorch实现MNIST手写数字识别(非常详细)
LetNet、AlexNet、ResNet网络模型实现手写数字识别
本篇文章主要分享使用 LetNet、AlexNet、ResNet网络模型实现手写数字识别,文章是基于《MNIST手写数字识别》这篇文章的拓展:
不去幼儿园
2024/12/03
1810
LetNet、AlexNet、ResNet网络模型实现手写数字识别
Pytorch 基于LeNet的手写数字识别
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Pytorch 基于LeNet的手写数字识别 更多内容请见👇 Python sklearn实现SVM鸢尾花分类 Python sklearn实现K-means鸢尾花聚类 Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集) ---- 本文目录 介绍 1.导入相关库 2.定义 Le
小嗷犬
2022/11/15
8200
Pytorch 基于LeNet的手写数字识别
CNN神经网络--手写数字识别
CNN神经网络–手写数字识别 引入包 python import numpy as np import tensorflow as tf 下载并载入 MNIST 手写数字库(55000 * 28 *
MiChong
2020/09/24
1.2K0
CNN神经网络--手写数字识别
pytorch:实践MNIST手写数字识别
在datasets.MNIST的中可以设置download=True,这样设置,系统会自动在root里面检测MNIST数据文件,如果存在则不下载,如果不存在则自动联网下载。我尝试自动联网下载,结果十几分钟之后,下载一半之后报错,网络出现问题。于是翻阅其它资源,将其手动下载下来添加到minst文件夹中自动创建的raw文件夹中。 (如果你也需要这个数据集,可以在微信公众号“我有一计”内回复“数据集”,即可获取下载链接)
zstar
2022/06/14
4850
pytorch实现 --- 手写数字识别
使用pytorch实现手写数字识别,十分简单的小项目,环境搭建好,一跑就通。
不去幼儿园
2024/12/03
2890
pytorch实现 --- 手写数字识别
「深度学习一遍过」必修19:基于LeNet-5的MNIST手写数字识别
https://github.com/zhao302014/Classic_model_examples/tree/main/1998_LeNet-5_MNIST
荣仔_最靓的仔
2022/01/10
1.1K0
「深度学习一遍过」必修19:基于LeNet-5的MNIST手写数字识别
【项目实战】MNIST 手写数字识别(下)
本文将介绍如何在 PyTorch 中构建一个简单的卷积神经网络,并训练它使用 MNIST 数据集识别手写数字,这将可以被看做是图像识别的 “Hello, World!”;
sidiot
2023/08/31
2880
【项目实战】MNIST 手写数字识别(下)
手写数字识别之网络结构
无论是牛顿第二定律任务,还是房价预测任务,输入特征和输出预测值之间的关系均可以使用“直线”刻画(使用线性方程来表达)。但手写数字识别任务的输入像素和输出数字标签之间的关系显然不是线性的,甚至这个关系复杂到我们靠人脑难以直观理解的程度。
zhangjiqun
2024/12/14
1070
手写数字识别之网络结构
多注释:用PyTorch实现卷积神经网络对MNIST手写数字数据集的分类
本文将为尽可能多的代码作注释,用PyTorch实现对手写数字数据集MNIST的分类,我也是一个PyTorch的初学者,如果你也是一个刚学pytorch没多久的朋友,希望我的注释能够让您尽可能看明白。因个人水平有限,如有什么写错的地方,敬请指正。
用户7886150
2020/12/27
1.5K0
手写数字识别之损失函数
给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普遍的说,交叉熵用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出成本的大小。
zhangjiqun
2024/12/14
1120
手写数字识别之损失函数
「深度学习一遍过」必修20:基于AlexNet的MNIST手写数字识别
Classic_model_examples/2012_AlexNet_MNIST at main · zhao302014/Classic_model_examples · GitHub
荣仔_最靓的仔
2022/01/10
2K0
「深度学习一遍过」必修20:基于AlexNet的MNIST手写数字识别
[Kaggle] Digit Recognizer 手写数字识别(卷积神经网络)
相关博文: [Hands On ML] 3. 分类(MNIST手写数字预测) [Kaggle] Digit Recognizer 手写数字识别 [Kaggle] Digit Recognizer 手写数字识别(简单神经网络) 04.卷积神经网络 W1.卷积神经网络
Michael阿明
2021/02/19
1.4K0
[Kaggle] Digit Recognizer 手写数字识别(卷积神经网络)
手撕CNN的MNIST手写数字识别
废话不多说直接上代码,这次研究了一下pytorch中的二维卷积的函数,所以人为的改了一下代码,毕竟一直模仿是行不通的,就和修车一样,你得拆了之后再组装起来才能说明你good at修车。
Tom2Code
2023/02/14
5100
手撕CNN的MNIST手写数字识别
推荐阅读
相关推荐
使用循环神经网络做手写数字识别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档