Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >入门项目数字手写体识别:使用Keras完成CNN模型搭建

入门项目数字手写体识别:使用Keras完成CNN模型搭建

作者头像
用户3578099
发布于 2019-08-16 09:26:21
发布于 2019-08-16 09:26:21
89100
代码可运行
举报
文章被收录于专栏:AI科技时讯AI科技时讯
运行总次数:0
代码可运行

对于图像分类任务而言,卷积神经网络(CNN)是目前最优的网络结构,没有之一。在面部识别自动驾驶、物体检测等领域,CNN被广泛使用,并都取得了最优性能。对于绝大多数深度学习新手而言,数字手写体识别任务可能是第一个上手的项目,网络上也充斥着各种各样的成熟工具箱的相关代码,新手在利用相关工具箱跑一遍程序后就能立刻得到很好的结果,这时候获得的感受只有一个——深度学习真神奇,却没能真正了解整个算法的具体流程。本文将利用Keras和TensorFlow设计一个简单的二维卷积神经网络(CNN)模型,手把手教你用代码完成MNIST数字识别任务,便于理解深度学习的整个流程。

准备数据

模型使用的MNIST数据集,该数据集是目前最大的数字手写体数据集(0~9),总共包含60,000张训练图像和10,000张测试图像,每张图像的大小为28x28,灰度图。第一步是加载数据集,可以通过Keras API完成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#源代码不能直接下载,在这里进行稍微修改,下载数据集后指定路径#下载链接:https://pan.baidu.com/s/1jH6uFFC 密码: dw3dfrom __future__ import print_functionimport kerasimport numpy as np  
path='./mnist.npz'  f = np.load(path)
X_train, y_train = f['x_train'], f['y_train']  
X_test, y_test = f['x_test'], f['y_test'] 

上述代码中,X_train表示训练数据集,总共60,000张28x28大小的手写体图像,y_train表示训练图像对应的标签。同理,X_test表示测试数据集,总共10,000张28x28大小的手写体图像,y_test表示测试图像对应的标签。下面对数据集部分数据进行可视化,以便更好地了解构建的模型深度学习模型的目的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
fig = plt.figure()for i in range(9):
 plt.subplot(3,3,i+1)
 plt.tight_layout()
 plt.imshow(X_train[i], cmap='gray', interpolation='none')
 plt.title("Digit: {}".format(y_train[i]))
 plt.xticks([])
 plt.yticks([])
fig

从图中可以看到,左上角是存储在训练集X_train[0]的手写体图像‘5’,y_train[0]表示对应的标签‘5’。整个深度学习模型的功能是训练好之后能够预测出别人手写的数字具体是什么。 对于神经网络而言,一般需要对原始数据进行预处理。常见的预处理方式是调整图像大小、对像素值进行归一化等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# let's print the actual data shape before we reshape and normalizeprint("X_train shape", X_train.shape)print("y_train shape", y_train.shape)print("X_test shape", X_test.shape)print("y_test shape", y_test.shape)#input image size 28*28img_rows , img_cols = 28, 28#reshaping#"channels_first" assumes (channels, conv_dim1, conv_dim2, conv_dim3).X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)
X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)#more reshapingX_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255print('X_train shape:', X_train.shape) #X_train shape: (60000, 28, 28, 1)

对图像信息进行必要的处理之后,标签数据y_train和y_test被转换为分类格式(向量形式),即标签‘3’被转换为向量[ 0,0,0,1,0,0,0,0,0,0]用于建模,标签向量非零的位置减一(从0开始)后表示该图像的具体标签,即若图像的标签向量在下标5处不为0,则表示该图像代表数字‘4’。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import keras#set number of categoriesnum_category = 10# convert class vectors to binary class matricesy_train = keras.utils.to_categorical(y_train, num_category)
y_test = keras.utils.to_categorical(y_test, num_category)

构建和编译模型

在数据准备好提供给模型后,需要定义模型的体系结构并使用必要的优化函数,损失函数和性能指标进行编译。 构建模型遵循的体系结构是经典卷积神经网络,分别含有2个卷积层,之后是连接全连接层和softmax分类器。如果你对每层的作用不熟悉的话,建议学习CS231课程。 在最大池化层和全连接层之后,模型中引入dropout作为正则化来减少过拟合问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#导入相关层的结构from __future__ import print_functionimport kerasfrom keras.datasets import mnistfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2Dfrom keras import backend as kimport matplotlib.pyplot as pltimport numpy as np## model buildingmodel = Sequential()#convolutional layer with rectified linear unit activationmodel.add(Conv2D(32, kernel_size=(3, 3),
                activation='relu',
                input_shape=input_shape))#32 convolution filters used each of size 3x3#againmodel.add(Conv2D(64, (3, 3), activation='relu'))#64 convolution filters used each of size 3x3#choose the best features via poolingmodel.add(MaxPooling2D(pool_size=(2, 2)))#randomly turn neurons on and off to improve convergencemodel.add(Dropout(0.25))#flatten since too many dimensions, we only want a classification outputmodel.add(Flatten())#fully connected to get all relevant datamodel.add(Dense(128, activation='relu'))#one more dropout for convergence' sake :) model.add(Dropout(0.5))#output a softmax to squash the matrix into output probabilitiesmodel.add(Dense(num_category, activation='softmax'))

模型搭建好之后,需要进行编译。在本文使用categorical_crossentropy多分类损失函数。由于所有的标签都具有相似的权重,因此将其作为性能指标,并使用AdaDelta梯度下降技术来优化模型参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Adaptive learning rate (adaDelta) is a popular form of gradient descent rivaled only by adam and adagrad#categorical ce since we have multiple classes (10) model.compile(loss=keras.losses.categorical_crossentropy,
             optimizer=keras.optimizers.Adadelta(),
             metrics=['accuracy'])

训练和评估模型

在定义和编译模型架构之后,需要使用训练数据对模型进行训练,以便能够识别手写数字。即使用X_train和y_train来拟合模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
batch_size = 128
num_epoch = 10#model trainingmodel_log = model.fit(X_train, y_train,
         batch_size=batch_size,
         epochs=num_epoch,
         verbose=1,
         validation_data=(X_test, y_test))

Epoch表示对所有训练样本进行一个前向传播过程和一个反向传播过程,Batch_Size表示每次前向过程和反向过程时处理的训练样本数,训练输出如下所示:

模型训练好后需要评估其性能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
score = model.evaluate(X_test, y_test, verbose=0)print('Test loss:', score[0]) #Test loss: 0.0296396646054print('Test accuracy:', score[1]) #Test accuracy: 0.9904

可以看到,测试准确性高达99%+,这也意味着该模型对于预测训练得很好。对整个过程训练和测试过程进行可视化,即画出训练和测试的准确曲线与损失函数曲线,如下所示。从图中可以看到,随着训练迭代次数的增加,模型在训练和测试数据上的损失和准确性趋于一致,模型最终趋于稳定。

保存模型参数

模型训练好后需要保存训练好的参数,以便下次直接调用。模型的体系结构或结构将存储在json文件中,权重将以hdf5文件格式存储。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Save the model# serialize model to JSONmodel_digit_json = model.to_json()with open("model_digit.json", "w") as json_file:
   json_file.write(model_digit_json)# serialize weights to HDF5model.save_weights("model_digit.h5")
print("Saved model to disk")

因此,保存好的模型可以之后进行重复使用或轻易地迁移到其他应用场景中。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技时讯 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于MNIST手写体数字识别--含可直接使用代码【Python+Tensorflow+CNN+Keras】
利用数据集:MNIST http://yann.lecun.com/exdb/mnist/ 完成手写体数字识别 紫色yyds
司六米希
2022/11/15
5.5K0
基于MNIST手写体数字识别--含可直接使用代码【Python+Tensorflow+CNN+Keras】
我们建了个模型,搞定了 MNIST 数字识别任务
对于图像分类任务,当前最先进的架构是卷积神经网络 (CNNs).。无论是面部识别、自动驾驶还是目标检测,CNN 得到广泛使用。在本文中,针对著名的 MNIST 数字识别任务,我们设计了一个以 tensorflow 为后台技术、基于 keras 的简单 2D 卷积神经网络 (CNN) 模型。整个工作流程如下:
AI研习社
2018/07/26
7790
我们建了个模型,搞定了 MNIST 数字识别任务
用深度学习keras的cnn做图像识别分类,准确率达97%
Keras是一个简约,高度模块化的神经网络库。 可以很容易和快速实现原型(通过总模块化,极简主义,和可扩展性) 同时支持卷积网络(vision)和复发性的网络(序列数据)。以及两者的组合。 无缝地运行在CPU和GPU上。 keras的资源库网址为https://github.com/fchollet/keras olivettifaces人脸数据库介绍 Olivetti Faces是纽约大学的一个比较小的人脸库,由 40个人的400张图片构成,即每个人的人脸图片为10张。每张图片的灰度级为8位,每个像素
机器学习AI算法工程
2018/03/15
2.7K0
用深度学习keras的cnn做图像识别分类,准确率达97%
Keras Callback之RemoteMonitor
Keras提供了一系列的回调函数,用来在训练网络的过程中,查看网络的内部信息,或者控制网络训练的过程。BaseLogger、ProgbarLogger用来在命令行输出Log信息(默认会调用), EarlyStopping、ReduceLROnPlateu分别用来提前终止训练和自动调整学习率,改变网络训练过程;而今天要介绍的RemoteMonitor则用来实时输出网络训练过程中的结果变化情况,包括训练集准确率(accu)、训练集损失值(loss)、验证集准确率(val_acc)、验证集损失值(val_loss),用户也可以自己修改需要显示的数据。一图胜千言,看看下面的结果图吧:
王云峰
2019/12/25
9280
Keras Callback之RemoteMonitor
Keras介绍
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:
用户7886150
2021/02/14
1.2K0
机器学习-用keras做cnn手写数字识别
在用全连接做手写数字识别的时候,准确率有97%了,但是还是会出现一些测试图片没有预测对,出来更好的去优化参数,现在就直接改进神经网络的模型,用cnn去训练数据。
sjw1998
2019/09/28
9960
Keras-深度学习-神经网络-手写数字识别模型
使用到的数据集为IMDB电影评论情感分类数据集,该数据集包含 50,000 条电影评论,其中 25,000 条用于训练,25,000 条用于测试。每条评论被标记为正面或负面情感,因此该数据集是一个二分类问题。
叶茂林
2023/07/30
2680
Keras-深度学习-神经网络-手写数字识别模型
基于keras的手写数字识别_数字识别
Flatten层: Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡,举例如下
全栈程序员站长
2022/10/05
1.9K0
Auto ML 一种自动完成机器学习任务的系统
在 2018 年比较火,很多大公司都开源了各自的auto ml库,例如 Cloud AutoML, AUTO KERAS, Auto Sklearn, Auto Weka 等,
杨熹
2019/02/20
5480
Auto ML 一种自动完成机器学习任务的系统
是选择Keras还是PyTorch开始你的深度学习之旅呢?
原文:https://medium.com/@karan_jakhar/keras-vs-pytorch-dilemma-dc434e5b5ae0
kbsc13
2020/05/22
5770
用多层感知机识别手写体(Keras)
独热编码即 One-Hot-coding,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。例如对六个状态进行编码:自然顺序码为 000,001,010,011,100,101独热编码则是 000001,000010,000100,001000,010000,100000
用户3577892
2020/06/11
2.7K0
【深度残差收缩网络】超简单Keras代码
从本质上讲,深度残差收缩网络属于卷积神经网络,是深度残差网络(deep residual network, ResNet)的一个变种。它的核心思想在于,在深度学习进行特征学习的过程中,剔除冗余信息是非常重要的;软阈值化是一种非常灵活的、删除冗余信息的方式。
用户6831054
2019/12/31
2.3K0
【深度残差收缩网络】超简单Keras代码
Keras入门级MNIST手写数字识别超级详细教程
文件下载:https://download.csdn.net/download/sxf1061700625/19229794
小锋学长生活大爆炸
2021/05/30
6.7K0
Keras入门级MNIST手写数字识别超级详细教程
用Keras通过Python进行卷积神经网络的手写数字识别
图像识别是深度学习技术的一个普遍具有的功能。
青橙.
2018/02/07
6K0
用Keras通过Python进行卷积神经网络的手写数字识别
基于vision-ml模型训练框架改造以及实际场景应用识别弹窗
在之前的很多分享中,在UI自动化处理上,大家都是对弹窗做了很多的讲解,不管是最近看的360测试之美,还是之前的各种分享中,但是一直都没有实战过。那天看了https://testerhome.com/articles/27527文章半天,也没有写出来代码,但是呢,在和大佬沟通中呢,推荐了美团开源的一个框架--vision-ml
雷子
2021/12/09
4951
基于vision-ml模型训练框架改造以及实际场景应用识别弹窗
数据科学 IPython 笔记本 四、Keras(下)
为了节省时间,你可以采样一个观测子集(例如 1000 个),这是你选择的特定数字(例如 6)和 1000 非特定数字的观察值(即非 6)。我们将使用它构建一个模型,并查看它在测试数据集上的表现。
ApacheCN_飞龙
2022/05/07
8640
数据科学 IPython 笔记本 四、Keras(下)
Python人工智能 | 十七.Keras搭建分类神经网络及MNIST数字图像案例分析
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章详细讲解了Keras环境搭建、入门基础及回归神经网络案例。本篇文章将通过Keras实现分类学习,以MNIST数字图片为例进行讲解。基础性文章,希望对您有所帮助!
Eastmount
2022/04/19
1K0
Python人工智能 | 十七.Keras搭建分类神经网络及MNIST数字图像案例分析
TensorFlow快餐教程:程序员快速入门深度学习五步法
作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。
AI科技大本营
2018/07/23
4240
TensorFlow快餐教程:程序员快速入门深度学习五步法
TensorFlow快餐教程:程序员快速入门深度学习五步法
作者简介:刘子瑛,阿里巴巴操作系统框架专家;CSDN 博客专家。工作十余年,一直对数学与人工智能算法相关、新编程语言、新开发方法等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术进步。 作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。 我们可以用 5 步 + 4 种基本元素 + 9 种基本层结构,这 5-4-9 模型来总结。 5步法: 1. 构造网络模型 2. 编译模型 3. 训练模型 4. 评估模型 5. 使用模型进行预测 4种基本元素:
用户1737318
2018/07/20
5060
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
在本文中,我们将学习如何使用keras,用手写数字图像数据集(即MNIST)进行深度学习。本文的目的是为了让大家亲身体验并熟悉培训课程中的神经网络部分。
拓端
2022/06/08
1.5K0
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
推荐阅读
相关推荐
基于MNIST手写体数字识别--含可直接使用代码【Python+Tensorflow+CNN+Keras】
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验