博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
keras入门--Mnist手写体识别
阅读量:7090 次
发布时间:2019-06-28

本文共 6750 字,大约阅读时间需要 22 分钟。

介绍如何使用keras搭建一个多层感知机实现手写体识别及搭建一个神经网络最小的必备知识

import keras # 导入kerasdir(keras) # 查看keras常用的模块['Input', 'Model', 'Sequential', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'absolute_import', 'activations', 'applications', 'backend', 'callbacks', 'constraints', 'datasets', 'engine', 'initializers', 'layers', 'legacy', 'losses', 'metrics', 'models', 'optimizers', 'preprocessing', 'regularizers', 'utils', 'wrappers']

keras常用模块的简单介绍

  • 'Input','Model','Sequential',这三个模块是以前老的接口,新的版本已经将它们融合到后面的模块当中 
  • 以'__'开头的模块是一些内嵌的模块 
  • 'activations'是激活函数,包括像sigmoid,relu,softmax等 
  • 'applications'是应用,这里面提供了已经训练好的keras模型,像图像识别的VGG等 
  • 'backend'是后端函数,keras通过它来操作其他的后端执行代码,像tensorflow,theano等,在后面使用models时,models会自动地调用 
  • 'callbacks'是一个回调的抽象函数,在高级应用里面可以用来展示训练过程中网络内部的状态 
  • 'constraints'是一个约束项,主要是能够对神经网络进行约束,来防止神经网络的过拟合 
  • 'datasets'里面包含了很多神经网络常用的数据集 
  • 'engine'是引擎模块,是layers的核心代码,主要是用来实现神经网络的拓补结构,后面的层的构建都是从这里继承而来 
  • 'initializers'是初始化方法 
  • 'layers'里面包含了keras已经实现的一些网络层,像全连接层Dense,卷积神经网络中的Conv 
  • 'legacy'是遗留代码,旧版本的代码都放在里面 
  • 'losses'是目标函数,也就损失函数,代价函数等,包括像均方差误差,交叉熵等等,用来衡量神经网络训练过程中的训练的好坏,能够看在迭代的过程中神经网络的一个训练情况 
  • 'metrics'是评估函数,可以用来评估神经网络的性能,里面包括像准确度,召回率等 
  • 'models'是模型库,Keras有两种类型的模型,序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为广泛,序贯模型是函数式模型的一种特殊情况。序贯模型:使用序贯模型可以像搭积木一样一层一层地网上叠加神经网络 
  • 'optimizers'是优化器,神经网络编译时必备的参数之一,可以用来在神经网络训练过程当中来更新权值的一个方法 
  • 'preprocessing'是预处理模块,包括对数据,序列,文本以及图像数据的预处理 
  • 'regularizers'是正则化方法,是用来防止神经网络在训练过程中出现过拟合 
  • 'utils'工具模块,本模块提供了一系列有用工具,用于提供像数据转换,数据规范化等功能 
  • 'wrappers'包装器(层封装器),能够将普通层进行包装,比如将普通数据封装成时序数据

本次所用Keras基础模块

 

from keras.models import Sequential # 导入序贯模型,可以通过顺序的方式,叠加神经网络层model = Sequential() # 构造一个模型对象modelmodel.add(Dense(8))from keras.layers import DenseDense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, **kwargs)from keras import optimizersInit signature: optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False, **kwargs)optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

手写体识别

import keras # 导入Kerasfrom keras.datasets import mnist # 从keras中导入mnist数据集from keras.models import Sequential # 导入序贯模型from keras.layers import Dense # 导入全连接层from keras.optimizers import SGD # 导入优化函数Using TensorFlow backend.(x_train, y_train), (x_test, y_test) = mnist.load_data() # 下载mnist数据集print(x_train.shape,y_train.shape) # 60000张28*28的单通道灰度图print(x_test.shape,y_test.shape)(60000, 28, 28) (60000,)(10000, 28, 28) (10000,)import matplotlib.pyplot as plt # 导入可视化的包im = plt.imshow(x_train[0],cmap='gray')plt.show()y_train[0]

x_train = x_train.reshape(60000,784) # 将图片摊平,变成向量x_test = x_test.reshape(10000,784) # 对测试集进行同样的处理print(x_train.shape)print(x_test.shape)(60000, 784)(10000, 784)x_train[0]array([  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,         0,   0,   0,   0,   0,   0,   0,   0,   0,   3,  18,  18,  18,       126, 136, 175,  26, 166, 255, 247, 127,   0,   0,   0,   0,   0,         0,   0,   0,   0,   0,   0,   0,  30,  36,  94, 154, 170, 253,       253, 253, 253, 253, 225, 172, 253, 242, 195,  64,   0,   0,   0,         0,   0,   0,   0,   0,   0,   0,   0,  49, 238, 253, 253, 253,       253, 253, 253, 253, 253, 251,  93,  82,  82,  56,  39,   0,   0,         0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,       136, 253, 253, 253, 212, 135, 132,  16,   0,   0,   0,   0,   0,         0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,         0,   0,   0,   0], dtype=uint8)

对数据进行归一化处理

x_train = x_train / 255x_test = x_test / 255x_train[0]array([0.        , 0.        , 0.        , 0.        , 0.        ,       0.        , 0.        , 0.01176471, 0.07058824, 0.07058824,       0.07058824, 0.49411765, 0.53333333, 0.68627451, 0.10196078,       0.65098039, 1.        , 0.96862745, 0.49803922, 0.        ,       0.        , 0.        , 0.        , 0.        , 0.        ,       0.        , 0.        , 0.        , 0.        , 0.        ,       0.        , 0.11764706, 0.14117647, 0.36862745, 0.60392157,       0.66666667, 0.99215686, 0.99215686, 0.99215686, 0.99215686,       0.99215686, 0.88235294, 0.6745098 , 0.99215686, 0.94901961,       0.76470588, 0.25098039, 0.        , 0.        , 0.        ,       0.        , 0.53333333, 0.99215686, 0.99215686, 0.99215686,       0.83137255, 0.52941176, 0.51764706, 0.0627451 , 0.        ,       0.        , 0.        , 0.        , 0.        ])

对y标签进行处理,5 --> [ 0, 0, 0, 0, 0,1, 0, 0, 0, 0] ,使用keras的utils工具集中的函数可以做到

y_train = keras.utils.to_categorical(y_train,10)y_test = keras.utils.to_categorical(y_test,10)

构建模型

model = Sequential() # 构建一个空的序贯模型# 添加神经网络层model.add(Dense(512,activation='relu',input_shape=(784,)))model.add(Dense(256,activation='relu'))model.add(Dense(10,activation='softmax'))model.summary()_________________________________________________________________Layer (type)                 Output Shape              Param #   =================================================================dense_1 (Dense)              (None, 512)               401920    _________________________________________________________________dense_2 (Dense)              (None, 256)               131328    _________________________________________________________________dense_3 (Dense)              (None, 10)                2570      =================================================================Total params: 535,818Trainable params: 535,818Non-trainable params: 0_________________________________________________________________

将神经网络进行编译

model.compile(optimizer=SGD(),loss='categorical_crossentropy',metrics=['accuracy'])

模型的训练

model.fit(x_train,y_train,batch_size=64,epochs=5,validation_data=(x_test,y_test)) # 此处直接将测试集用作了验证集Train on 60000 samples, validate on 10000 samplesEpoch 1/560000/60000 [==============================] - 8s 141us/step - loss: 0.7648 - acc: 0.8165 - val_loss: 0.3706 - val_acc: 0.9027Epoch 2/560000/60000 [==============================] - 8s 138us/step - loss: 0.3383 - acc: 0.9069 - val_loss: 0.2891 - val_acc: 0.9190Epoch 3/560000/60000 [==============================] - 8s 128us/step - loss: 0.2821 - acc: 0.9208 - val_loss: 0.2558 - val_acc: 0.9257Epoch 4/560000/60000 [==============================] - 7s 111us/step - loss: 0.2496 - acc: 0.9296 - val_loss: 0.2281 - val_acc: 0.9350Epoch 5/560000/60000 [==============================] - 8s 127us/step - loss: 0.2256 - acc: 0.9364 - val_loss: 0.2117 - val_acc: 0.9391

模型的得分情况

score = model.evaluate(x_test,y_test)print("loss:",score[0])print("accu:",score[1])10000/10000 [==============================] - 0s 47us/steploss: 0.2117454363614321accu: 0.9391

 

转载于:https://www.cnblogs.com/ncuhwxiong/p/9836648.html

你可能感兴趣的文章
firewall ports for ESXi 6.x
查看>>
【4】万魂杀服务器开发方面之配置生成工具
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
相对路径和绝对路径 目录的创建 cd mkdir rm 等命令
查看>>
MongoDB基本管理命令
查看>>
文件/文件夹操作
查看>>
dubbo-spring-boot-starter
查看>>
iterator
查看>>
[瞎折腾]使用freemarker编写MyBatis的Mapper.xml自动生成工具
查看>>
linux下环境变量汇总
查看>>
C/C++实现环形缓冲
查看>>
我的友情链接
查看>>
俞敏洪:坚持下去不是因为我很坚强,而是因为我别无选择
查看>>
大公司的我们和他们
查看>>
velocity 在Netiler下常用指令及应用
查看>>
sed命令详解
查看>>
python datetime和calendar模块常用功能
查看>>
spark入门
查看>>
Hibernate Session各种状态转换方法分析
查看>>