keras 入门:卷积神经网络实现 MNIST 手写数字识别

2、基于Keras、Mnist手写数字识别数据集构建卷积神经网络(CNN)训练模型 文章目录前言一、卷积神经网络二、构建CNN网络训练模型1.引入库2.载入数据3.数据处理4.创建模型5.编译模型7.评估模型总结 前言 提示:本篇文章导入库函数,载入数据与本人第一篇训练模型文章一致: 1、基于Keras、Mnist手写数字识别数据集构建全连接神经网络训练模型 以下是本篇文章正文内容,下面案例仅供参考 一、卷积神经网络 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural 阅读详情

keras 入门:卷积神经网络实现 MNIST 手写数字识别

手写数字识别问题作为机器学习领域中的一个经典问题,本文介绍如何使用 keras 构建卷积神经网络模型实现 MNIST 手写数字识别。文本代码只需更换训练集目录,修改图片输入尺寸和类别数量等少量参数,即可直接应用到其他图像分类的问题中。

一、数据准备

关于如何解析 MNIST 数据集,可以参看另一片文章:python 读取 MNIST 数据集,并解析为图片文件。解析出的数据集具有如下目录结构:

mnist_data/
    |----train/
        |----0/
            |----0.png
        |----1/
            |----1.png
...
    |----test/
...

二、keras 搭建卷积神经网络

1. 卷积神经网络简介

卷积神经网络的概念最早出自 19 世纪 60 年代提出的感受野 ( Receptive Field [1]),到了 20 世纪 80 年代,日本科学家提出神经认知机 ( Neocognitron [2] ) 的概念,是卷积神经网络的实现原型。卷积神经网络可以利用空间结构关系减少需要学习的参数量,提高反向传播算法的训练效率。一般的 CNN 有多个卷积层构成,每个卷积层会进行如下操作:

  • 图像通过多个不同的卷积核的滤波,并加偏置 ( bias ),提取出局部特征,每一个卷积核会映射出一个新的 2D 图像。
  • 将前面卷积核的滤波输出结果进行非线性的激活函数处理。
  • 对激活函数的结果再进行池化操作 ( 即降采样),目前一般是使用最大池化,保留最显著的特征,并提升模型的畸变容忍能力。
    这几个步骤就构成最常见的卷积层,当然也可以在加上一个 LRN [3] ( Local Response Normalization,局部响应归一化层) 层。
    CNN 的要点是卷积核的权值共享 ( Weight Sharing )、局部连接模式 ( Local Connection )和池化层 ( Pooling ) 中的降采样 ( Down-Sampling )。局部连接和权值共享降低了参数量,使训练复杂度大大下降,减轻过拟合并降低计算量。同时权值共享还赋予了 CNN 对平移的容忍性,而池化层降采样则进一步降低了输出层参数,并赋予模型轻度形变的容忍性,提高模型的泛化能力。
    LeNet5 [4] 提出于1994 年,是最早的深层卷积神经网络之一。LeNet5 当时的特性有如下几点:
  • 每个卷基层包含三个部分:卷积、池化和非线性激活函数
  • 使用卷积提取空间特征
  • 降采样的平均池化层
  • 双曲正切或 S 型的激活函数
  • MLP 作为最后的分类器
  • 层与层之间的稀疏连接减少计算复杂度

2. 卷积神经网络搭建

使用 keras API 可以很容易搭建一个卷积神经网络,在此我们搭建的网络结构具有 重复三重的 3 * 3 卷积核加 2 * 2 最大池化层,最后加两个全连接层。

第一层卷积输入图像尺寸,设置64个卷积核,经过 2 * 2 最大池化层后,第二层卷积层需要 128 个卷积核,同理第三层卷积是 256 个卷积核。然后将矩阵平整为一维,接一层 256 输出的全链接层,最后一层输出为类别标签数的全连接层,并且该层使用 ‘softmax’ 作为激活函数。

def build_model(self):
    """构建网络模型"""
    setting = self.setting
    model = Sequential()
    model.add(Conv2D(64, (3, 3), input_shape=setting.input_shape))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(128, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(256, (3, 3)))
    model.add(Activation('relu'))
    model.add(Flatten())
    model.add(Dropout(0.5))
    model.add(Dense(256))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(setting.lebel_nums))
    model.add(Activation('softmax'))
    model.compile(loss='categorical_crossentropy',
                  optimizer='rmsprop',
                  metrics=['accuracy'])
    return model

使用 keras 的图像预处理类可以很容易加载图像数据并进行数据预处理,详情可以参考 keras 的官方文档:ImageDataGenerator。将训练集划分 20% 作为验证集,将像素点缩放为 0~1.0 的尺度。

def data_generator(self, setting: Setting):
    """图像数据生成器,对生成的字体图像划分训练集和验证集,同时进行数据增强,提高模型泛化能力。"""
    datagen = ImageDataGenerator(
        rescale=1.0 / 255,
        validation_split=0.2
    )
    train_generator = datagen.flow_from_directory(
        setting.train_dir,
        target_size=(setting.img_width, setting.img_height),
        batch_size=setting.batch_size,
        class_mode='categorical',
        subset='training'
    )
    validation_generator = datagen.flow_from_directory(
        setting.train_dir,
        target_size=(setting.img_width, setting.img_height),
        batch_size=setting.batch_size,
        class_mode='categorical',
        subset='validation'
    )
    return train_generator, validation_generator

在此,我将程序用到的一些参数的设置放置于一个设置类中:

class Setting:
    """配置类"""
    def __init__(self):
        self.data_dir = 'mnist_data/'
        self.train_dir = self.data_dir + 'train'
        self.test_dir = self.data_dir + 'test'
        self.img_width = 28
        self.img_height = 28
        # 在不同系统中,通道数的位置可能不同,因此图像的输入维度略有不同
        if backend.image_data_format() == 'channels_first':
            self.input_shape = (3, self.img_width, self.img_height)
        else:
            self.input_shape = (self.img_width, self.img_height, 3)
        # 模型训练过程中,根据验证准确率的提升保存模型权重参数
        self.checkpoint_path = self.data_dir + 'model_weight/weights-improvement-{epoch:02d}-{val_acc:.5f}.hdf5'
        
        # 这两个参数可以设置加载现有模型继续重新训练
        self.restore_model = None
        self.is_restore = False
        # 模型应用预测可以将所需识别的图像放置于 tmp 文件夹中
        self.imp_dir = self.data_dir + 'tmp'

        # 模型训练的配置
        self.lebel_nums = 10
        self.epoches = 20   # 训练的总轮次
        self.save_epoches = 1   # 模型保存的检验轮次
        self.batch_size = 32
        self.initial_epoch = 0

全部代码见 mnist_keras.py 文件。

3. 模型结果评估

训练模型只需以如下命令运行 mnist_keras.py 文件:

python mnist_keras.py --mode train

在 GPU 中训练可以很快就能训练结束,第 8 轮中验证集正确率达到 0.98825 后便不再提升。

用测试集评估模型:

python mnist_keras.py --mode evaluate

得到 0.9895 的正确率。

在应用模型预测时,将图片放置于 tmp 文件夹中

在这里插入图片描述

运行模型预测

python mnist_keras.py --mode predict

运行后得到预测结果:

mnist_dat/tmp/8.png
预测结果为:8
mnist_dat/tmp/9.png
预测结果为:9
mnist_dat/tmp/4.png
预测结果为:4
mnist_dat/tmp/5.png
预测结果为:5
mnist_dat/tmp/7.png
预测结果为:7
mnist_dat/tmp/6.png
预测结果为:6
mnist_dat/tmp/2.png
预测结果为:2
mnist_dat/tmp/3.png
预测结果为:3
mnist_dat/tmp/1.png
预测结果为:1
mnist_dat/tmp/0.png
预测结果为:0

参考文献

[1] Sherrington C S. Observations on the scratch-reflex in the spinal dog[J]. Journal of Physiology, 1906, 34(1-2):1.

[2] Fukushima K, Miyake S, Ito T. Neocognitron: a neural network model for a mechanism of visual pattern recognition[M]// Competition and Cooperation in Neural Nets. Springer Berlin Heidelberg, 1982:826-834.

[3] Krizhevsky A, Sutskever I, Hinton G E. ImageNet classification with deep convolutional neural networks[J]. Communications of the Acm, 2012, 60(2):2012.

[4] Lecun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11):2278-2324.

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

相关推荐

【PaddlePaddle】 mnist手写数字识别(卷积神经网络)

这篇文章主要讲解了卷积神经网络的使用。卷积神经网络可以用来提取图像特征,所以在计算机视觉上有很好的效果。 系统:ubuntu18.04 python版本:python2.7 目录训练模型进行预测完整代码 训练模型 先把需要用到的模块导入进来。 #coding:utf-8 ''' created on February 10 23:18 2019 @author:lhy ''' import nu...

qq_41427568的博客 9055

使用Keras构建CNN用于训练和识别MNIST手写数据集(内附完整代码)

Keras: 是一个用Python编写的深度学习API,运行在机器学习平台TensorFlow之上。它的开发重点是实现快速实验, 类似于把tensorflow各个模块都集成为一个软件工具包,直接调用就行,简单方便。在这篇文章中,我们将构建一个简单的卷积神经网络(CNN),并训练它用Keras训练和识别MNIST手写数据集。 MNIST:手写数字图片数据集 CNN: 卷积神经网络 本示例使用的CNN一共有三层神经网络,卷积层(conv),池化层(pooling),全连接层(fullyconnec..

caicau的博客 1932

keras实现mnist数据集手写数字识别

经过几天的爬坑,“东搞西搞”终于把深度学习的“HELLO,WORLD”做出来了,以下是自己的实战过程: 关于keras识别手写数字的入门准备: 1.Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。所以在安装keras的前面,要先搭建tensorflow环境和安装https://www.tensorflow.org/i...

陈正经 2万+

用PyTorch实现MNIST手写数字识别(非常详细)

hello大家好!我又来搬文章了!我就不信还有比这更详细的?! MNIST可以说是机器学习入门的hello word了!导师一般第一个就让你研究MNIST,研究透了,也算基本入门了。好的,今天就来扯一扯学一学。 在本文中,我们将在PyTorch中构建一个简单的卷积神经网络,并使用MNIST数据集训练它识别手写数字。在MNIST数据集上训练分类器可以看作是......

xfxuezhang.cn 16万+

keras入门实战:手写数字识别

【声明】本文是blog的翻译和个人的学习笔记导读近些年由于理论知识的硬件的快速发展,使得深度学习达到了空前的火热。深度学习已经在很多方面都成功得到了应用,尤其是在图像识别和分类领域,机器识别图像的能力甚至超过了人类。本文用深度学习Python库Keras实现深度学习入门教程mnist手写数字识别。mnist手写数字识别是机器学习和深度学习领域的“hello world”,MNIST数据集是手写数字的

sunwill的博客 1万+

TensorFlow 2.0 mnist手写数字识别(CNN卷积神经网络)

TensorFlow 2.0 (五) - mnist手写数字识别(CNN卷积神经网络) 源代码/数据集已上传到Github - tensorflow-tutorial-samples 大白话讲解卷积神经网络工作原理,推荐一个bilibili的讲卷积神经网络的视频,up主从youtube搬运过来,用中文讲了一遍。 这篇文章是TensorFlow 2.0 Tutorial入门教程的第五篇文章,介绍如何使用卷积神经网络(Convolutional Neural Network,CNN)来提高...

sinat_28371057的博客 2806

Keras实现CNN图像识别:从MNIST手写数字入门

卷积神经网络(CNN)是计算机视觉的基础架构,其核心在于通过局部感受野、权值共享和空间下采样提取图像层次化特征。原理上,CNN利用多层卷积核自动学习边缘、纹理、部件到语义的逐级抽象表示;技术价值体现在参数效率高、平移不变性强、可解释性逐步提升;典型应用场景涵盖手写识别、工业质检、医学影像初筛等轻量级视觉任务。本文以Keras为工具,基于MNIST数据集构建并可视化一个极简但完整的2卷积+2池化+1全连接CNN模型,深入解析padding、Dropout、Flatten等关键操作的实际影响,并强调归一化与四维

weixin_38168760的博客 797

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

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

qq1744828575的博客 1749

深度学习——CNN实现MNIST手写数字的识别

本篇博客记录了学习K同学啊的深度学习100例的第一例的学习过程,主要介绍了CNN神经网络的基本知识,使用方法及使用流程, 简单介绍了数据集的归一化和标准化 激活函数 优化器 损失函数 metrics等配置............

尘心平的博客 2万+

Keras:利用卷积神经网络(CNN)识别手写数字

环境python3.5 今天介绍如何利用卷积神经网络进行MNIST数据集的手写数字识别,即将手写数字图像images识别为数字标签labels。 目录 数据预处理 模型建立 评估模型准确率 进行预测 1 建模思路如下图: 数据预处理 1 MNIST数据集共有训练数据60 000项、测试数据10 000项。其数据都由images(数字图像)与labels(真实的数字)所组成 尝试调用该数据集的第0项 下面展示数据集的前十项: 接下来进行数据预处理 1、...

m0_60720638的博客 2218

Keras与CNN结合实现手写数字识别实战指南

在现代深度学习领域中,Keras凭借其简单直观的API和模块化设计,成为了众多开发者和研究人员的首选框架。本章将带领读者入门Keras,揭开它如何简化神经网络构建与训练过程的神秘面纱。MNIST数据集是一个包含60,000个训练样本和10,000个测试样本的大型数据库,用于手写数字识别。它由纽约大学的Yann LeCun等人构建,目的是为了提供一个能够测试机器学习算法性能的标准数据集。由于其广泛的使用和开放性,MNIST成为了入门级机器学习以及深度学习研究的“Hello, World!”程序。

weixin_30820933的博客 1611

Keras入门级MNIST手写数字识别超级详细教程

MNIST 手写数字分类数据集 该MNIST数据集是代表标准和技术数据集的改良研究所的缩写。 它是一个包含 60,000 张 0 到 9 之间的手写单个数字的 60,000 个小正方形 28×28 像素灰度图像的数据集。 任务是将给定的手写数字图像分类为 10 个类别之一,代表从 0 到 9 的整数值,包括 0 到 9。 它是一个广泛使用且深入理解的数据集,并且在大多数情况下已“解决”。表现最好的模型是深度学习卷积神经网络,其分类准确率超过 99%,在保持测试数据集上的错误率在 0.4% 到 0.2

xfxuezhang.cn 2万+

DFT设计绪论

DFT设计的主要目的是为了将defect-free的芯片交给客户。 产品质量,通常使用Parts Per million(PPM)来衡量。 但是随着IC从SSI到VLSI的发展,在test上花销的时间越来越多,test的quality却很难提高,这使得DFT的engineer不断的发展着DFT的技术。 DFT engineer面对的第一个问题是设计内部的状态的可测试性问题。在...

ahr7882的博客 1195

基于卷积神经网络CNN的手写数字识别、手写学号识别实验报告

基于卷积神经网络CNN的手写数字识别、手写学号识别实验报告

2201_75285525的博客 1万+

从原理到实现:在《图灵完备》中构建一个144*256像素、1536时钟刻/帧的视频播放器

本文详细解析了在《图灵完备》游戏中构建144*256像素、1536时钟刻/帧视频播放器的全过程。从图灵完备原理出发,通过分层架构设计、视频数据预处理和关键电路实现,展示了如何用基础电子元件模拟现代显卡功能。重点介绍了像素坐标定位系统和颜色数据处理流水线的优化方案,为游戏内复杂电子系统设计提供实践指导。

weixin_42520025的博客 445

ubuntu20.04安装nvidia-docker(解决有 Release 文件。 N: 无法安全地用该源进行更新,所以默认禁用该源错误)

然后想都不要想,nvidia+linux安装的东西,那肯定是不能安装成功的,恶毒的nvidia。按照nvidia官网给出的安装nvidia-docker流程来。在sudo apt-get update出现报错。然后再次update,发现还是会有一些警告类似于。,直接点击网页手动下载,发现下载成功!,注意会有安装先后顺序,安装给的提示就行。最后输入命令发现安装成功。然后替换掉里面的内容。直接不管,直接上命令。

weixin_48144140的博客 1236

Keras搭建CNN(手写数字识别Mnist)

MNIST数据集是手写数字识别通用的数据集,其中的数据是以二进制的形式保存的,每个数字是由28*28的矩阵表示的。 我们使用卷积神经网络对这些手写数字进行识别,步骤大致为: 导入库和模块 我们导入Sequential模型(相当于放积木的桌子) from keras.models import Sequential 接下来,导入各种层(相当于形状各异的积木) from keras.layers...

Firmiana1220的博客 5091

单周期CPU设计【Verilog】

第一章 单周期CPU的设计原理 为实现单周期CPU,本文首先研究了单周期CPU的相关理论和工作原理。本章首先简要介绍单周期CPU的基本概念,然后对CPU的工作原理进行简要分析,以便为单周期CPU的设计和开发提供理论基础。 1.1 单周期CPU概述 中央处理器,即CPU,作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。在CPU内部,电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一

醉酒、冰城外 2万+

Tensorflow+Keras入门——利用mnist手写数字识别快速入门Keras

本文简介 基于Keras+Tensorflow,利用Lenet-5模型的mnist手写数字识别的完整程序和代码分析。适合想要入门Keras的新手。 博主由于很久没碰Tensorflow,很多代码都报了类似WARNING:tensorflow:From /someplace/xx.py:xxx: xxx is deprecated and will be removed in a future ve...

umbrellalalalala的博客 4399

AI人工智能与数据挖掘的技术融合趋势

我们的目的是搞清楚AI人工智能和数据挖掘是怎么融合在一起的,以及这种融合未来会有什么样的发展趋势。范围涵盖了这两种技术融合的原理、应用场景,还有未来可能面临的挑战。我们会先讲讲AI人工智能和数据挖掘是什么,它们之间有什么关系。然后说说它们融合的算法原理、数学模型。接着通过一个实际的项目案例,看看它们是怎么在实际中运用的。还会介绍一些它们的应用场景和相关工具。最后分析一下未来的发展趋势和挑战,并且总结学到的知识,提出一些思考题让大家思考。AI人工智能。

AI 领航者的博客 1367

基于Transformer的股票市场多因子量化选股模型,深度解析:基于Transformer的股票市场多因子量化选股模型

传统多因子模型通常采用线性回归、岭回归或Lasso回归来估计因子权重,其核心假设是因子与未来收益之间存在线性关系。然而,现实中的股票市场具有典型的非线性、非平稳和高噪声特征。卷积神经网络(CNN)擅长提取局部特征,但难以捕捉全市场股票之间的全局依赖关系;循环神经网络(RNN)及其变体LSTM虽然能处理时间序列,但存在梯度消失问题且难以并行计算。Transformer的self-attention机制能够:直接建模任意两只股票之间的相关性动态计算因子权重而非静态线性组合。

YOLO 250

使用keras CNN卷积神经网络训练mnist手写数字识别并输入图片预测

前言 CNN卷积网络结构由输入层、输出层、卷积层、池化层、全连接层构成。 相比于传统的NN,CNN更好的诠释了神经网络,也使得模型就更加稳健。 本次实验使用CNN来训练mnist手写数字识别并预测。 准备工作 TensorFlow版本:1.13.1 Keras版本:2.1.6 Numpy版本:1.18.0 matplotlib版本:2.2.2 导入所需的库 from keras.datasets import mnist from keras.utils import np_utils from k

番茄Salad 4187

【施磊】C++课程笔记目录

【C++编程】施磊老师C++笔记目录

GeniusAng的博客 4122

Keras+CNN模型识别手写数字(mnist)详细分析

CNN模型 CNN卷积神经网络,包含卷积层(卷积运算提取输入的不同特征,更多层的网络能从低级特征中迭代提取等复杂的特征),线性整流层(RELU),池化层(卷积后会得到维度很大的特征,将特征切成几个区域,取最大值或平均值,得到新的较小维度特征),全连接层(局部特征结合变成全局特征,计算最后得分) 卷积:使用卷积核对图像进行扫描,得到特征图 池化:池化即下采样,目的减少特征图 详细内容参见:https://blog.youkuaiyun.com/liangchunjiang/article/detai.

zhr1030635594的博客 3325

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深度学习笔记:用卷积神经网络进行MNIST手写数字识别

上一篇我们用全连接层(Dense layer)实现了一个分类器用于MNIST手写数字识别。但是由于MNIST的数据样本是28x28的图像,所以更适合于用卷积神经网络来实现它的识别任务。本文就来介绍如何构建一个简单的卷积神经网络用于MNIST手写数字识别。

chenxy_bwave的专栏 6210

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: python 读取 MNIST 数据集,并解析为图片文件
下一篇: python 的 logging 模块日志功能使用详解
XnCSD
博客等级 码龄12年 132粉丝 30原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值