keras与卷积神经网络(CNN)实现识别minist手写数字
在本篇博文当中,笔者采用了卷积神经网络来对手写数字进行识别,采用的神经网络的结构是:输入图片——卷积层——池化层——卷积层——池化层——卷积层——池化层——Flatten层——全连接层(64个神经元)——全连接层(500个神经元)——softmax函数,最后得到分类的结果。Flatten层用于将池化之后的多个二维数组展开成一维数组,再灌入全连接层的神经元当中。
首先导包:
import keras
from keras import layers
from keras import models
建立神经网络的顺序模型:
model = models.Sequential()
添加神经网络的结构(三组卷积层,池化层。一个flatten层,以及两个全连接层),激活函数我一般喜欢使用relu,当然你也可以使用sigmoid,tanh这两个激活函数,更改我的代码即可。由于是手写数字,最后的softmax一共只能够有十个数字,因此输出写10.激活函数使用softmax。其他都是relu。
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(500, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
神经网络搭建完毕,开始导minist手写数字,对数字进行分类,分为训练集和验证集,同时将数字进行reshape,代码如下:
from keras.datasets import mnist
from keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
紧接着选择需要进行梯度下降的优化器,常见的有adagrad,adam,rmsprop等等,这里选择了rmsprop。损失函数loss function这里选择了Cross Entropy,也就是交叉熵(因为最后是一个softmax函数进行分类,我们常常用交叉熵来衡量模型的准确度,这个计算起来比较方便,也比较有道理)。模型fit的过程当中我选择了mini—batch小批量梯度下降法,用这个方法比较适合电脑,如果使用所有数据进行梯度下降,那么电脑跑很久才能够完成,如果使用小批量梯度下降,电脑则可以自动进行并行计算,时间减少。迭代次数我选择了10次,每一个mini——batch的批量为128,这个无所谓,这个参数适中即可,不可太大也不能太小。代码如下:
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=10, batch_size=128)
输出:
Epoch 1/10
60000/60000 [==============================] - 42s 703us/step - loss: 0.0192 - acc: 0.9940
Epoch 2/10
60000/60000 [==============================] - 42s 706us/step - loss: 0.0166 - acc: 0.9945
Epoch 3/10
60000/60000 [==============================] - 43s 724us/step - loss: 0.0146 - acc: 0.99580s - loss: 0.0145 - acc: 0.9
Epoch 4/10
60000/60000 [==============================] - 43s 720us/step - loss: 0.0129 - acc: 0.9960
Epoch 5/10
60000/60000 [==============================] - 43s 718us/step - loss: 0.0130 - acc: 0.9962
Epoch 6/10
60000/60000 [==============================] - 44s 728us/step - loss: 0.0105 - acc: 0.9966
Epoch 7/10
60000/60000 [==============================] - 44s 737us/step - loss: 0.0095 - acc: 0.9969
Epoch 8/10
60000/60000 [==============================] - 44s 728us/step - loss: 0.0101 - acc: 0.9972
Epoch 9/10
60000/60000 [==============================] - 44s 735us/step - loss: 0.0085 - acc: 0.9974
Epoch 10/10
60000/60000 [==============================] - 45s 743us/step - loss: 0.0081 - acc: 0.99750s - loss: 0.0081 - acc: 0.997
可以看到模型经过十次迭代,训练集的准确度已经达到了%99.7以上,这样会不会出现过拟合的情况呢?用不用减少一下模型的迭代次数呢?笔者的心里怕怕的,于是用验证集来验证一下模型的准确度:
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_acc)
输出:
0.9868
模型的准确度达到了%98.68,接近百分之九十九的样子,比笔者仅用全连接神经网络训练的结果高了零点几的准确度,从中还是可以看出卷积神经网络的有效性,在没有进行调参的情况下准确度已经很高了!
keras与卷积神经网络(CNN)实现识别minist手写数字的更多相关文章
- 利用神经网络算法的C#手写数字识别(一)
利用神经网络算法的C#手写数字识别 转发来自云加社区,用于学习机器学习与神经网络 欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwri ...
- 利用神经网络算法的C#手写数字识别(二)
利用神经网络算法的C#手写数字识别(二) 本篇主要内容: 让项目编译通过,并能打开图片进行识别. 1. 从上一篇<利用神经网络算法的C#手写数字识别>中的源码地址下载源码与资源, ...
- 利用神经网络算法的C#手写数字识别
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwritten_character_recognition.zip 下载源码 - 70. ...
- python-积卷神经网络全面理解-tensorflow实现手写数字识别
首先,关于神经网络,其实是一个结合很多知识点的一个算法,关于cnn(积卷神经网络)大家需要了解: 下面给出我之前总结的这两个知识点(基于吴恩达的机器学习) 代价函数: 代价函数 代价函数(Cost F ...
- 使用卷积神经网络CNN训练识别mnist
算的的上是自己搭建的第一个卷积神经网络.网络结构比较简单. 输入为单通道的mnist数据集.它是一张28*28,包含784个特征值的图片 我们第一层输入,使用5*5的卷积核进行卷积,输出32张特征图, ...
- 吴裕雄 python 神经网络——TensorFlow 使用卷积神经网络训练和预测MNIST手写数据集
import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_dat ...
- CNN完成mnist数据集手写数字识别
# coding: utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data d ...
- Tensorflow笔记——神经网络图像识别(五)手写数字识别
- 多层全连接神经网络实现minist手写数字分类
import torch import numpy as np import torch.nn as nn from torch.autograd import Variable import tor ...
随机推荐
- Redis01——Redis究竟支持哪些数据结构
Redis已经越来越多地应用到互联网技术中,而关于Redis的相关问题,也成为面试中必不可少的一部分,本文开始将会逐渐把我了解到的关于Redis的一些面试问题整理出来,供各位参考,如有不对之处,烦请指 ...
- springboot项目中接口入参的简单校验
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- 网页中三角型的CSS实现
我们在使用CSS框架的时候,经常会用到下拉框组件,一般该组件里面有个下三角.很多网上用到三角形,如图所示,这个三角形是如何实现的呢? 1.使用CSS可以实现,先来复习一CSS盒子模型相关知识.给出如下 ...
- python的C扩展调用,使用原生的python-C-Api
1.在文件第一行包含python调用扩展的头文件 #include <Python.h> 2.用原生C写好需要调用的函数 int add_one(int a){ ; } 3.用python ...
- Natas8 Writeup(常见编码、php函数)
Natas8: 同样给了php源码,审计源码,发现给了一个预设参数encodedSecret,以及一个加密函数encodeSecret, 该函数将secret参数先进行base64编码.然后用strr ...
- json到底是什么??????
JSON(JavaScript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格式.JSON是基于文本的,轻量级的,通常被认为易于读/写. 通俗解释: 1.j ...
- Spring框架——AOP
Spring AOP 面向切面编程,OOP面向对象编程,将程序中所有参与模块都抽象成对象,然后通过对象之间的相互调用完成需求. AOP是OOP的一种补充,是在另外一个维度上抽象出对象,具体是指程序运行 ...
- 循序渐进地聊一聊 box-shaow
影子在现实生活中可以是一个物体的副本,在 CSS 中也是这样的,相当于复制了那个元素(并不是真正的元素,对页面布局没有任何影响),可以从下面的代码中看出来. .container { width: 1 ...
- Magento2-2.3.4 win10安装完magento无法加载静态资源导致无法进入后台登录页面
后台面无法进入,截图如下
- Java并发编程之支持并发的list集合你知道吗
Java并发编程之-list集合的并发. 我们都知道Java集合类中的arrayList是线程不安全的.那么怎么证明是线程不安全的呢?怎么解决在并发环境下使用安全的list集合类呢? 本篇是<凯 ...