专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
51好读  ›  专栏  ›  程序员大咖

构建多层感知器神经网络对数字图片进行文本识别

程序员大咖  · 公众号  · 程序员  · 2017-10-22 10:24

正文

点击上方“ 程序员大咖 ”,选择“置顶公众号”

关键时刻,第一时间送达!


在Keras环境下构建多层感知器模型,对数字图像进行精确识别。


模型不消耗大量计算资源,使用了cpu版本的keras,以Tensorflow 作为backended,在ipython交互环境jupyter notebook中进行编写。


1.数据来源


在Yann LeCun的博客页面上下载开源的mnist数据库:

http://yann.lecun.com/exdb/mnist/


此数据库包含四部分:训练数据集、训练数据集标签、测试数据集、测试数据集标签。由于训练模型为有监督类型的判别模型,因此标签必不可少。若使用该数据集做k-means聚类,则不需要使用标签。将数据整合之后放入user.kerasdatasets文件夹以供调用。


也可以直接从keras建议的url直接下载:https://s3.amazonaws.com/img-datasets/mnist.npz


其中训练数据集包含了60000张手写数字的图片和这些图片分别对应的标签;测试数据集包含了10000张手写数字的图片和这些图片分别对应的标签.



2.数据格式和前期处理(在此不涉及)


训练数据集包含60000张图片,测试数据集包含10000张,所有图片都被当量化为28pixel*28pixel的大小。为减少向量长度,将图片灰度处理,每个像素用一个RGB值表示(0~255),这是因为灰度处理后的RGB值加了归一约束,向量长度相是灰度处理前的1/3。至此,每个图片都可以用28*28的向量表示。


3.导入依赖库


打开jupyter notebook后导入依赖库numpy,此处的seed为随机量的标签,可随意设置:


from __future__ import print_function

import numpy as np

np . random . seed ( 9999 )


继续从keras中导入使用到的模块:


from keras . datasets import mnist

from keras . models import Sequential

from keras . layers . core import Dense , Dropout , Activation

from keras . optimizers import SGD , Adam , RMSprop

from keras . utils import np_utils


mnist为之前准备的数据集,Dense为全连接神经元层,Dropout为神经元输入的断接率,Activation为神经元层的激励函数设置。


导入绘图工具,以便之后绘制模型简化图:


from keras.utils.vis_utils import plot_model as plot


4.处理导入的数据集


处理数据集


  1. 为了符合神经网络对输入数据的要求,原本为60000*28*28shape的三维ndarray,改变成了尺寸为60000*784的2维数组,每行为一个example,每一列为一个feature。

  2. 神经网络用到大量线性与求导运算,将输入的feature的数值类型改变为32位float。

  3. 将feature值归一化,原本0~255的feature归一为0~1。

  4. 测试数据集同理。


( X_train , y_train ), ( X_test , y_test ) = mnist . load_data ()

X_train = X_train . reshape ( 60000 , 28 * 28 )

X_test = X_test . reshape ( 10000 , 28 * 28 )

X_train = X_train . astype ( 'float32' )

X_test = X_test . astype ( 'float32' )

X_train /= 255

X_test /= 255


处理标签


文本识别问题本质是一个多元分类问题。将类向量转换为二进制数表示的类矩阵,其中每一行都是每一个example对应一个label。label为10维向量,每一位代表了此label对应的example属于特定类(0~10)的概率。此时Y_train为60000*10的向量,Y_test为10000*10的向量


Y_train = np_utils . to_categorical ( y_train , nb_classes )

Y_test = np_utils . to_categorical ( y_test , nb_classes )


5.用keras建立神经网络模型


batch_size = 128

nb_classes = 10

nb_epoch = 20

model = Sequential ()

model . add







请到「今天看啥」查看全文