基于卷积神经网络CNN的手写数字识别

基于CNN卷积神经网络手写数字识别模型 基于CNN手写数字识别模型训练一、CNN(卷积神经网络)简介二、实验设计实验结果最终代码 一、CNN(卷积神经网络)简介 1.1 卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一,在图像处理和识别的方向上取得很大的成就,本文只要进行的是基于CNN卷积神经网络的数字识别模型训练。 1.2 卷积神经网络结构:输入层——隐藏层——输出层,其中隐藏层包括卷积层(Convolution)、池化层(Pooling)、全连接层(Dense),其结构基本如下 二、实验设计 2.1 实验 阅读详情

1.CNN卷积神经网络中的几个概念

想象现在你有一张手写数字图片,你需要识别它是0-9中的哪个数字,一种思路是寻找图片局部的特征,如果这个图片和某个数字的大部分局部特征最相似,则将该图片识别为该数字。

卷积核(Convolution Kernel)

卷积核就是判断为哪个数字所需要的图片的局部特征,不过CNN中卷积核的选择是由根据大量数据训练生成的,而不是我们人类根据经验选定的。如下图所示,中间三个小片段就是所谓的卷积核,就好比一块块小的拼图碎片,需要在被识别的图片中寻找相似的片段来决定和哪个数字相似。
卷积核

卷积(Convolution)

通俗的说,寻找局部相似片段的过程就叫做卷积,我的理解就是拿着上面的片段(卷积核)在被识别的图片上从上到下,从左到右比对一遍(这里还涉及到步长、边界补零等)。那么,如何将“比对”用数学运算来表示呢?如下图所示,将卷积核与图片相应位置分别做乘法后累加,累加的结果表征比对的“相似程度”。在原图经过标准化的情况下(数据标准化到-1与1之间),结果越接近1,说明原图的这个局部与要寻找的片段(卷积核)越相似,比如上图右边计算结果代表的格子越白(越接近1),原图该部位与相应卷积核越相似。
卷积

池化(Pooling)

什么是池化呢?我目前的理解是一种降维方法。在保留原图大部分特征的前提下,降低图片的尺寸,以达到减少运算量的目的。池化主要有最大值池化和平均值池化两种方法,如下图所示是最大值池化,将原图2X2方格中的最大值代表该局部的值,生成新的图片。这样就将原图4X4大小的数据降维到2X2大小,虽然数据信息减少了,但原图的重要特征任然保留。你可能感觉这种方法没什么大的作用,但当图片极其庞大,信息量巨大的情况下,池化是优化算法,减轻运算量的一种重要手段。
池化

2.导入mnist手写数据集

#导入相应模块和数据集
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets('mnist_data',one_hot=True)

由于数据集较大,只选择一部分数据进行训练和测试

#获得训练集和测试集
X_train,y_train = mnist.train.images[:3000], mnist.train.labels[:3000]
X_test,y_test = mnist.test.images[:1000], mnist.test.labels[:1000]
#定义输出图片函数
def print_digits(images, y, max_n=10):
    # 图片尺寸
    fig = plt.figure(figsize=(12, 12)) # 宽,高,英寸为单位
    fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)
    i = 0
    while i <max_n and i <images.shape[0]:
        # 绘图
        p = fig.add_subplot(20, 20, i + 1, xticks=[], yticks=[])
        p.imshow(images[i].reshape(28,28), cmap=plt.cm.bone)
        i = i + 1
#查看训练集前100张
print_digits(X_train,y_train,100)

查看训练集前100张

3.构建卷积神经网络

构建神经网络前先画出其大体形态如下图所示(本例中只使用一层卷积+池化)。
在这里插入图片描述
然后根据所画的图依次构建各层

#定义输入、输出
input_x=tf.placeholder(tf.float32,[None,28*28])/255.
#输出是一个one_hot的向量
output_y=tf.placeholder(tf.int32,[None,10])
#输入层 [28*28*1]
input_x_images=tf.reshape(input_x,[-1,28,28,1])
#卷积层
#conv1 5*5*32
conv1=tf.layers.conv2d(
    inputs=input_x_images,
    filters=32,
    kernel_size=[5,5],
    strides=1,
    padding='same',
    activation=tf.nn.relu
)

各参数含义:
inputs 输入,是一个向量
filters 卷积核个数,也就是卷积层的厚度
kernel_size 卷积核的尺寸
strides: 扫描步长
padding: 边界补0,valid不需要补0,same需要补0
activation: 激活函数

#池化层
pool1=tf.layers.max_pooling2d(
    inputs=conv1,
    pool_size=[2,2],
    strides=2
)

各参数含义:
inputs 输入,张量必须要有四个维度
pool_size: 过滤器的尺寸
strides: 步长

#扁平化
flat=tf.reshape(pool1,[-1,14*14*32]
#形状变成了[?,6272]
#全连接层 
#inputs: 张量
#units: 神经元的个数
#activation: 激活函数
dense=tf.layers.dense(
    inputs=flat,
    units=1024,
    activation=tf.nn.relu
)
#输出层(本质是一个全连接层)
logits=tf.layers.dense(
    inputs=dense,
    units=10
)
#形状[?,10]
#计算误差 cross entropy(交叉熵),再用Softmax计算百分比的概率
#onehot_labels: 标签值
#logits: 神经网络的输出值
loss=tf.losses.softmax_cross_entropy(onehot_labels=output_y,logits=logits)
# 用Adam优化器来最小化误差,学习率0.001 类似梯度下降
train_op=tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(loss)
#精度,计算预测值和实际标签的匹配程度
#labels:真实标签
#predictions: 预测值
#Return: (accuracy,update_op)accuracy 是一个向量准确率,update_op 是一个op可以求出精度。
accuracy_op=tf.metrics.accuracy(
    labels=tf.argmax(output_y,axis=1),
    predictions=tf.argmax(logits,axis=1)
)[1]

4.训练卷积神经网络

#创建会话
sess=tf.Session()
#初始化全局和局部变量
init=tf.group(tf.global_variables_initializer(),
              tf.local_variables_initializer())
sess.run(init)
#迭代50000次
for i in range(50000):
    batch=mnist.train.next_batch(50)
    train_loss,train_operation=sess.run([loss,train_op],{input_x:batch[0],output_y:batch[1]})
    if i%1000 == 0:
        train_accuracy=sess.run(accuracy_op,{input_x:X_train,output_y:y_train})
        print("Step = %d, Train loss = %.4f,[Train accuracy = %.2f]" %(i,train_loss,train_accuracy))
Step = 0, Train loss = 2.2904,[Train accuracy = 0.13]
Step = 1000, Train loss = 1.2188,[Train accuracy = 0.47]
Step = 2000, Train loss = 0.5437,[Train accuracy = 0.60]
Step = 3000, Train loss = 0.5143,[Train accuracy = 0.67]
Step = 4000, Train loss = 0.2612,[Train accuracy = 0.72]
Step = 5000, Train loss = 0.4200,[Train accuracy = 0.75]
......
Step = 44000, Train loss = 0.0969,[Train accuracy = 0.92]
Step = 45000, Train loss = 0.1404,[Train accuracy = 0.93]
Step = 46000, Train loss = 0.0506,[Train accuracy = 0.93]
Step = 47000, Train loss = 0.0290,[Train accuracy = 0.93]
Step = 48000, Train loss = 0.0867,[Train accuracy = 0.93]
Step = 49000, Train loss = 0.0935,[Train accuracy = 0.93]

5.使用测试集测试

test_accuracy=sess.run(accuracy_op,{input_x:X_test,output_y:y_test})
print(test_accuracy)
0.9292303

可以看到,训练集准确率达到92%,说明对测试集的识别效果也较好

#查看测试集前20张
print_digits(X_test,y_test,20)

测试集前20张

#输出测试集前20个的预测值
test_output = sess.run(logits,{input_x:X_test[:20]})
y_pred = np.argmax(test_output,1)
print(y_pred,'predicted numbers')
print(np.argmax(y_test[:20],1),'real numbers')
sess.close()
[7 2 1 0 4 1 4 9 6 9 0 6 9 0 1 5 9 7 3 4] predicted numbers
[7 2 1 0 4 1 4 9 5 9 0 6 9 0 1 5 9 7 3 4] real numbers

可以看出,对手写数字的识别效果较好。该卷积神经网络只使用了一层卷积+池化层,可以继续尝试使用多层卷积+池化层进行优化

6.参考文献

[1] 使用tensorflow实现CNN
[2] tensorflow中文文档

CNN卷积神经网络手写数字识别实例及代码详解 本文的代码来自githup的Deep Learning的toolbox,是用Matlab实现的。感谢该toolbox的作者付出和分享。 我在应该该代码进行训练时,出现一些报错,如expand函数应用不对,flipall函数未定义等问题,对这些问题进行了修正,完成网络训练和验证。 本文mnist_uint8.mat的获取可以参照我的另一篇博客:MNIST数据库处理--matlab生成mnist_ 阅读详情

相关推荐

PyTorch: CNN实战MNIST手写数字识别

PyTorch: CNN实战MNIST手写数字识别cnn导包加载数据构造CNN训练并计算损失结果 cnn 卷积神经网络CNN的结构一般包含这几个层: 输入层:用于数据的输入 卷积层:使用卷积核进行特征提取和特征映射 激励层:由于卷积也是一种线性运算,因此需要增加非线性映射 池化层:进行下采样,对特征图稀疏处理,减少数据运算量。 全连接层:通常在CNN的尾部进行重新拟合,减少特征信息的损失...

devcy的博客 3187

CNN卷积神经网络实现手写数字识别(基于tensorflow)

cnn实现卷积神经网络,附全部代码,小白易懂。

m0_63669388的博客 8774

Tensorflow基于卷积神经网络(CNN)的手写数字识别

一、简介 本项目在Tensorflow平台下利用卷积神经网络(CNN)实现了对mnist数据集(28*28)的手写数字图片的识别,通过5000*50个样本训练后,对500个样本进行测试,准确率可以达到95%左右。本文完整代码:https://github.com/iapcoder/cnnMnistRecognition。 二、mnist数据集简介 MNIST(Mixed National I...

wangTongGen 8991

深度学习大神都推荐入门必须读完这9篇论文

Introduction 卷积神经网络CNN,虽然它听起来就像是生物学、数学和计算机的奇怪混杂产物,但在近些年的机器视觉领域,它是最具影响力的创新结果。随着Alex Krizhevsky开始使用神经网络,将分类错误率由26%降到15%并赢得2012年度ImageNet竞赛(相当于机器视觉界的奥林匹克)时,它就开始声名大噪了。从那时起,一票公司开始在它们的核心服务中使用深度学习技术。例如Faceb

以笔为剑的唐吉坷德 4507

通过卷积神经网络(CNN)识别和预测手写数字

本文演示了使用Python的Pytorch库来完成一个卷积神经网络(CNN)来训练MNIST数据集,这个示例能够帮助更好的了解卷积神经网络(CNN)的原理。

eeee~~的博客 2131

基于Python卷积神经网络(CNN)的mnist手写数字识别

数字识别系统设计与实现

weixin_62375676的博客 1205

【深度学习基础】详解Pytorch搭建CNN卷积神经网络LeNet-5实现手写数字识别

本文相熟了卷积神经网络CNN的原理,并介绍了如何使用PyTorch框架搭建卷积神经网络模型CNN。实现了LeNet-5的模型的搭建、模型训练、测试、网络的复用、直观查看数据集的图片预测结果等,完成了机器学习领域的Hello world——手写数字识别。

Bossfrank的博客 1万+

基于Python卷积神经网络(CNN)实现手写数字识别

项目简介该项目旨在利用卷积神经网络(CNN)对手写数字图像进行分类,即识别图像中显示的0-9之间的数字。MNIST是一个包含大量手写数字图像和对应标签的数据集,是这一任务的常用基准数据集。项目步骤数据准备:下载并加载MNIST数据集。通常,这个数据集会被分成训练集和测试集两部分。对数据进行预处理,如归一化、调整尺寸等,以便输入到神经网络中。构建CNN模型:设计一个卷积神经网络结构。

qq1744828575的博客 1749

Tensorflow卷积神经网络(CNN)手写数字识别示例学习

一、问题描述 二、数据描述 三、网络结构 1. 输入层 2. 卷积层 3. 池化层 4. 全连接层 5. 输出层 四、示例网络结构 五、程序解读 1. 加载MNIST数据集 2. 创建Session和占位符 3. 定义卷积层1的权重和偏置量 4. 卷积层1 5. 池化层1 6. 定义卷积层2的权重和偏置量 7. 卷积层2和池化层2 8. 全连接层 9. 输出层 六、参考资料 七、...

张齐贤的博客 1万+

基于CNN 卷积神经网络手写数字图像识别

文章目录卷积神经网络手写数字图像识别1、导入相关库2、导入手写数据集3、定义数据包装器4、查看数据维度5、定义卷积网络层6、定义模型与损失函数、优化器7、训练、测试函数8、网络迭代训练9、保存模型10、加载模型11、模型测试 卷积神经网络手写数字图像识别 1、导入相关库 # pytorch框架 import torch from torch import nn,optim from torchvision import datasets,transforms from torch.utils.data i

优快云 精品推荐 1万+

【图像识别】基于卷积神经网络CNN手写数字识别matlab代码

1 简介 针对传统手写数字的随机性,无规律性等问题,为了提高手写数字识别的检测准确性,本文在研究手写数字区域特点的基础上,提出了一种新的手写数字识别检测方法.首先,对采集的手写数字图像进行预处理,由于原始图像包含各种各样的噪声,为了防止造成干扰,对图像进行去噪,滤波等处理;然后,在MATLAB中构建卷积神经网络(cNN)模型结构,采用CNN模型中典型的LeNET-5的卷积模型,通过对采集图像进行逐层学习,训练与测试,将学习得到的高层特征用于手写数字识别.以随机手写数字与字母进行图像验证,结果表明,该模型算

qq_59747472的博客 5899

实战+原理--手写数字识别--CNN卷积神经网络--matlab

实战+原理–手写数字识别–卷积神经网络–matlab Marshal Zheng 2019-04-13 文章目录实战+原理--手写数字识别--卷积神经网络--matlabTargetDatasetDataset-converted into bmpTrainTestResultTheory about CNN (Convolutional Neural Networks) Target 使用卷...

Marshal Zheng的博客 1万+

httprunner V4.3.5 安装与使用--快速上手(超详细-超长篇)

HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。继承 Requests 的全部特性,轻松实现 HTTP(S) 的各种测试需求测试用例与代码分离,采用YAML/JSON的形式描述测试场景,保障测试用例具备可维护性测试用例支持分层机制,充分实现测试用例的复用测试用例支持参数化和数据驱动机制使用 skip 机制实现对测试用例的分组执行控制。

Dreams°的博客 3892

深度学习--TensorFlow(项目)识别自己的手写数字(基于CNN卷积神经网络)

目录 基础理论 一、训练CNN卷积神经网络 1、载入数据 2、改变数据维度 3、归一化 4、独热编码 5、搭建CNN卷积神经网络 5-1、第一层:第一个卷积层 5-2、第二层:第二个卷积层 5-3、扁平化 5-4、第三层:第一个全连接层 5-5、第四层:第二个全连接层(输出层) 6、编译 7、训练 8、保存模型 代码 二、识别自己的手写数字(图像) 1、载入数据 2、载入训练好的模型 3、载入自己写的数字图片并设置大小 4、转灰度图 5、转黑底白字、数据归一化..

great_yzl的博客 2万+

电池管理系统(BMS)系列—状态估计之SOH

BMS系列文章,介绍了SOH估计

zxx52113140的博客 1846

HFSS实战:手把手教你设计一款小型化圆极化微带天线(附仿真文件)

本文详细介绍了使用HFSS设计小型化圆极化微带天线的完整流程,包括工程初始化、辐射贴片设计、仿真设置与优化等关键步骤。通过实战案例,帮助工程师掌握圆极化天线设计技巧,解决轴比控制和耦合馈电匹配等核心问题,适用于物联网终端和便携式设备应用。

weixin_32770423的博客 338

《深度学习》—— 卷积神经网络模型(CNN)对手写数字的识别

此模型训练的数据集是 torchvision 库中 datasets 数据包中的 MNIST 数据集 MNIST 数据集中含有 70000 张由不同的人手写数字图像,其中60000张训练集,10000张是测试集 每张图片都是灰度的,大小为28x28像素,且每张图片中的数字都是剧中的,以减少预处理和加块模型训练

weixin_73504499的博客 4629

基于STM32 HAL库的L298N四驱电机PWM调速与方向控制实战

本文详细介绍了基于STM32 HAL库驱动L298N电机控制板实现四驱小车PWM调速与方向控制的实战方法。涵盖硬件连接、GPIO与定时器配置、PWM生成、方向控制逻辑及电源管理等核心内容,并提供代码优化与常见问题解决方案,帮助开发者快速实现高效稳定的电机控制。

jump7的博客 222

《深度学习》卷积神经网络CNN 实现手写数字识别

卷积神经网络是一种深度学习模型,主要应用于图像和视频处理任务。它的设计灵感来源于生物视觉系统的工作原理。"""定义神经网络"""class CNN(nn.Module): # 继承nn算法中的Moduledef __init__(self): # 这里输入大小为(1,28,28)self.conv1 = nn.Sequential( # 第一层卷积, 将多个层组合成一起。nn.Conv2d( # 二维卷积成,2d一般用于图像,3d用于视频数据(多一个时间维度),1d一般用于结构化的序列数据。

wx_AHao1004Y的博客 3429

Windows 11下WSL2安装CUDA避坑指南:从驱动版本匹配到环境变量配置

本文详细解析了在Windows 11的WSL2中搭建CUDA开发环境的完整流程与核心避坑要点。关键在于理解“驱动在Windows,工具链在Linux”的独特架构,并确保显卡驱动与CUDA Toolkit版本严格匹配。指南涵盖了从驱动验证、WSL-Ubuntu专用仓库安装、环境变量配置到GCC版本冲突、GPU算力不匹配等常见问题的解决方案,帮助开发者高效构建稳定的深度学习与高性能计算环境。

smartcontract5的博客 466

2025海外代理IP深度横评:Bright Data、IPFoxy、SmartProxy等六大服务商实战对比

本文深度横评2025年六大海外代理IP服务商(Bright Data、IPFoxy、SmartProxy、IPIPGO、Kookeey及青果网络),基于实战测试数据,从IP池质量、速度稳定性、性价比等维度进行对比。针对跨境电商、数据爬虫、社交媒体管理等不同业务场景,提供精准的选购指南与避坑建议,帮助企业用户根据自身需求选择最合适的代理IP解决方案。

weixin_29196891的博客 434

python卷积神经网络(CNN)手写数字识别实现详解

卷积神经网络经典案例,手写数字识别代码详解,注释之处如有错误,欢迎指正 from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf #初始化权重函数 def weight_variable(shape): initial = tf.truncated_normal(shape,s...

import_torch_as_tf 8528

【LE Audio】CAP精讲[1]: 从理论到实操,CAP 协同流程入门全攻略

LEAudio生态中的CommonAudioProfile(CAP)是一个关键协同框架,它通过整合基础音频协议(BAP/VCP/MICP等)构建多设备协同能力。CAP定义了三大核心功能:音频流管理、设备组控制和统一交互服务,解决了传统蓝牙音频在多设备场景下的协同痛点。其规范历经v1.0到v1.0.1的优化,修正了角色定义、连接流程等关键模块,提升设备兼容性。CAP采用严格的语言约定(shall/must/should)和术语体系(ContextType/CCID/协同集),确保不同厂商设备能相互理解。

byte轻骑兵的技术小窝 2万+

TensorFlow实战笔记之(4):卷积神经网络(CNN) 实现手写数字识别

一、引言 前一篇博文使用单隐层的全连接神经网络,并结合一些神经网络的优化策略,如指数衰减学习率、正则化、Relu激活函数和Adam优化算法等,用包含100个隐层神经元的神经网络实现了MNIST数据集上手写数字识别98%的准确率。但是全连接神经网络也是有局限的,即使使用很深的网络、很多的隐层结点、很大的迭代轮数,也很难在MNIST数据集上得到99%以上的准确率。不过,卷积神经网络的出现解决了这一问...

polyhedronx的博客 6519

2026实测可用!4个专业AI Agent Skills垂直搜索平台对比

📊本文以表格形式整理4个实测可用的专业AI Agent Skills垂直搜索平台,涵盖资源规模、适配生态等关键维度🤖,适合开发者按需选择技能获取渠道,解决平台筛选与访问难题✨

XiaoqiangClub的博客 524

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【手写数字识别】基于卷积神经网络CNN实现手写数字识别分类matlab源码

一、CNN卷积神经网络 我们知道神经网络的结构是这样的: 那卷积神经网络跟它是什么关系呢? 其实卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进。比如下图中就多了许多传统神经网络没有的层次。 卷积神经网络的层级结构 • 数据输入层/ Input layer   • 卷积计算层/ CONV layer   • ReLU激励层 / ReLU layer   • 池化层 / Pooling layer   • 全连接层 / FC layer ...

m0_60703264的博客 2252

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 基于keras库训练BP神经网络的实例
AddVH
博客等级 码龄7年 13粉丝 5原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值