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

  1. import keras # 导入keras
  2. dir(keras) # 查看keras常用的模块
  3. ['Input',
  4. 'Model',
  5. 'Sequential',
  6. '__builtins__',
  7. '__cached__',
  8. '__doc__',
  9. '__file__',
  10. '__loader__',
  11. '__name__',
  12. '__package__',
  13. '__path__',
  14. '__spec__',
  15. '__version__',
  16. 'absolute_import',
  17. 'activations',
  18. 'applications',
  19. 'backend',
  20. 'callbacks',
  21. 'constraints',
  22. 'datasets',
  23. 'engine',
  24. 'initializers',
  25. 'layers',
  26. 'legacy',
  27. 'losses',
  28. 'metrics',
  29. 'models',
  30. 'optimizers',
  31. 'preprocessing',
  32. 'regularizers',
  33. 'utils',
  34. '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基础模块

  1. from keras.models import Sequential # 导入序贯模型,可以通过顺序的方式,叠加神经网络层
  2. model = Sequential() # 构造一个模型对象model
  3. model.add(Dense(8))
  4. from keras.layers import Dense
  5. Dense(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)
  6. from keras import optimizers
  7. Init signature: optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False, **kwargs)
  8. optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)
  9. <keras.optimizers.SGD at 0x54ef320>

手写体识别

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

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

对数据进行归一化处理

  1. x_train = x_train / 255
  2. x_test = x_test / 255
  3. x_train[0]
  4. array([0. , 0. , 0. , 0. , 0. ,
  5. 0. , 0. , 0.01176471, 0.07058824, 0.07058824,
  6. 0.07058824, 0.49411765, 0.53333333, 0.68627451, 0.10196078,
  7. 0.65098039, 1. , 0.96862745, 0.49803922, 0. ,
  8. 0. , 0. , 0. , 0. , 0. ,
  9. 0. , 0. , 0. , 0. , 0. ,
  10. 0. , 0.11764706, 0.14117647, 0.36862745, 0.60392157,
  11. 0.66666667, 0.99215686, 0.99215686, 0.99215686, 0.99215686,
  12. 0.99215686, 0.88235294, 0.6745098 , 0.99215686, 0.94901961,
  13. 0.76470588, 0.25098039, 0. , 0. , 0. ,
  14. 0. , 0.53333333, 0.99215686, 0.99215686, 0.99215686,
  15. 0.83137255, 0.52941176, 0.51764706, 0.0627451 , 0. ,
  16. 0. , 0. , 0. , 0. ])

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

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

构建模型

  1. model = Sequential() # 构建一个空的序贯模型
  2. # 添加神经网络层
  3. model.add(Dense(512,activation='relu',input_shape=(784,)))
  4. model.add(Dense(256,activation='relu'))
  5. model.add(Dense(10,activation='softmax'))
  6. model.summary()
  7. _________________________________________________________________
  8. Layer (type) Output Shape Param #
  9. =================================================================
  10. dense_1 (Dense) (None, 512) 401920
  11. _________________________________________________________________
  12. dense_2 (Dense) (None, 256) 131328
  13. _________________________________________________________________
  14. dense_3 (Dense) (None, 10) 2570
  15. =================================================================
  16. Total params: 535,818
  17. Trainable params: 535,818
  18. Non-trainable params: 0
  19. _________________________________________________________________

将神经网络进行编译

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

模型的训练

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

模型的得分情况

  1. score = model.evaluate(x_test,y_test)
  2. print("loss:",score[0])
  3. print("accu:",score[1])
  4. 10000/10000 [==============================] - 0s 47us/step
  5. loss: 0.2117454363614321
  6. accu: 0.9391

keras入门--Mnist手写体识别的更多相关文章

  1. R︱Softmax Regression建模 (MNIST 手写体识别和文档多分类应用)

    本文转载自经管之家论坛, R语言中的Softmax Regression建模 (MNIST 手写体识别和文档多分类应用) R中的softmaxreg包,发自2016-09-09,链接:https:// ...

  2. 深度学习-mnist手写体识别

    mnist手写体识别 Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分:55000行的训练数据集(mnist.t ...

  3. Tensorflow中使用CNN实现Mnist手写体识别

    本文参考Yann LeCun的LeNet5经典架构,稍加ps得到下面适用于本手写识别的cnn结构,构造一个两层卷积神经网络,神经网络的结构如下图所示: 输入-卷积-pooling-卷积-pooling ...

  4. keras框架下的深度学习(一)手写体识别

    这个系列文章主要记录使用keras框架来搭建深度学习模型的学习过程,其中有一些自己的想法和体会,主要学习的书籍是:Deep Learning with Python,使用的IDE是pycharm. 在 ...

  5. 入门项目数字手写体识别:使用Keras完成CNN模型搭建(重要)

    摘要: 本文是通过Keras实现深度学习入门项目——数字手写体识别,整个流程介绍比较详细,适合初学者上手实践. 对于图像分类任务而言,卷积神经网络(CNN)是目前最优的网络结构,没有之一.在面部识别. ...

  6. 数据挖掘入门系列教程(十一)之keras入门使用以及构建DNN网络识别MNIST

    简介 在上一篇博客:数据挖掘入门系列教程(十点五)之DNN介绍及公式推导中,详细的介绍了DNN,并对其进行了公式推导.本来这篇博客是准备直接介绍CNN的,但是想了一下,觉得还是使用keras构建一个D ...

  7. 数据挖掘入门系列教程(十二)之使用keras构建CNN网络识别CIFAR10

    简介 在上一篇博客:数据挖掘入门系列教程(十一点五)之CNN网络介绍中,介绍了CNN的工作原理和工作流程,在这一篇博客,将具体的使用代码来说明如何使用keras构建一个CNN网络来对CIFAR-10数 ...

  8. 记录二:tensorflow2.0写MNIST手写体

    最近学习神经网络,tensorflow,看了好多视频,查找了好多资料,感觉东西都没有融入自己的思维中.今天用tensorflow2.0写了一个MNIST手写体的版本,记录下学习的过程. 复现手写体识别 ...

  9. MXNET手写体识别的例子

    安装完MXNet之后,运行了官网的手写体识别的例子,这个相当于深度学习的Hello world了吧.. http://mxnet.io/tutorials/python/mnist.html 运行的过 ...

随机推荐

  1. Linux线程编程之生产者消费者问题【转】

    转自:http://www.cnblogs.com/clover-toeic/p/4029269.html 前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注 ...

  2. shell 监控磁盘使用率【转】

    方案一: disks=(`df |sed 1d | awk '{print $1,$5}'|tr -d %`) len=${#disks[@]} ;i<=$len;i=i+));do ];the ...

  3. Appium 1.6.3使用的自动化测试引擎

    automationName项的值: Appium:默认值. Selendroid:安卓2.3(API 9)-4.1(API 16)版本使用. UiAutomator2:最新安卓版本. XCUITes ...

  4. css给奇数行或偶数行添加指定样式

    odd表示奇数行,even表示偶数行; tr:nth-child(odd); .table-striped > tbody > tr:nth-child(odd) { background ...

  5. “您查看的网页正在试图关闭窗口。是否关闭此窗口”的屏蔽方法(JavaScript)

    原文:http://www.cnblogs.com/tigerhuolh/archive/2011/04/14/2015634.html 用JS代码关闭窗口时会提示“您查看的网页正在试图关闭窗口.是否 ...

  6. Debian系网络配置 /etc/network/interfaces

    说Debian系的网卡配置跟Redhat系很不一样,Redhat是放在/etc/sysconfig/network-scripts目录下面的一大堆文件里面,要修改?你一个一个文件来过吧.Debian系 ...

  7. python基础(5)---整型、字符串、列表、元组、字典内置方法和文件操作介绍

    对于python而言,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等特性 1.int 首先,我们来查看下int包含了哪些函数 # python3.x dir(int) # ['__a ...

  8. csu 1329 一行盒子(链表操作)

    1329: 一行盒子 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 693  Solved: 134 [Submit][Status][Web Boa ...

  9. 洛谷 P1469 找筷子 题解

    题目传送门 先排序一遍,再一个一个判断是否有偶数个.注意for循环要i+=2. #include<bits/stdc++.h> using namespace std; ]; int ma ...

  10. 为nginx配置https并自签名证书

    一.把证书准备好. 步骤与使用OpenSSL自签发服务器https证书所述大同小异.在这里再重复一次. 1.制作CA证书: ca.key CA私钥: openssl genrsa -des3 -out ...