教你如何用Keras搭建分类神经网络
摘要:本文主要通过Keras实现了一个分类学习的案例,并详细介绍了MNIST手写体识别数据集。
本文分享自华为云社区《[Python人工智能] 十七.Keras搭建分类神经网络及MNIST数字图像案例分析》,作者: eastmount 。
一.什么是分类学习
1.Classification
回归问题,它预测的是一个连续分布的值,例如房屋的价格、汽车的速度、Pizza的价格等。而当我们遇到需要判断一张图片是猫还是狗时,就不能再使用回归解决了,此时需要通过分类学习,把它分成计算机能够识别的那一类(猫或狗)。

如上图所示,通常来说,计算机处理的东西和人类有所不同,无论是声音、图片还是文字,它们都只能以数字0或1出现在计算机神经网络里。神经网络看到的图片其实都是一堆数字,对数字的加工处理最终生成另一堆数字,并且具有一定认知上的意义,通过一点点的处理能够得知计算机到底判断这张图片是猫还是狗。
分类(Classification) 属于有监督学习中的一类,它是数据挖掘、机器学习和数据科学中一个重要的研究领域。分类模型类似于人类学习的方式,通过对历史数据或训练集的学习得到一个目标函数,再用该目标函数预测新数据集的未知属性。分类模型主要包括两个步骤:
- 训练。给定一个数据集,每个样本都包含一组特征和一个类别信息,然后调用分类算法训练模型。
- 预测。利用生成的模型对新的数据集(测试集)进行分类预测,并判断其分类结果。
通常为了检验学习模型的性能会使用校验集。数据集会被分成不相交的训练集和测试集,训练集用来构造分类模型,测试集用来检验多少类标签被正确分类。

那么,回归和分类有什么区别呢?
分类和回归都属于监督学习,它们的区别在于:回归是用来预测连续的实数值,比如给定了房屋面积来预测房屋价格,返回的结果是房屋价格;而分类是用来预测有限的离散值,比如判断一个人是否患糖尿病,返回值是“是”或“否”。也就是说,明确对象属于哪个预定义的目标类,预定义的目标类是离散值时为分类,连续值时为回归。
2.MNIST
MNIST是手写体识别数据集,它是非常经典的一个神经网络示例。MNIST图片数据集包含了大量的数字手写体图片,如下图所示,我么可以尝试用它进行分类实验。

MNIST数据集是含标注信息的,上图分别表示数字5、0、4和1。该数据集共包含三部分:
- 训练数据集:55,000个样本,mnist.train
- 测试数据集:10,000个样本,mnist.test
- 验证数据集:5,000个样本,mnist.validation
通常,训练数据集用来训练模型,验证数据集用来检验所训练出来的模型的正确性和是否过拟合,测试集是不可见的(相当于一个黑盒),但我们最终的目的是使得所训练出来的模型在测试集上的效果(这里是准确性)达到最佳。
如下图所示,数据是以该形式被计算机所读取,比如28*28=784个像素点,白色的地方都是0,黑色的地方表示有数字的,总共有55000张图片。

MNIST数据集中的一个样本数据包含两部分内容:手写体图片和对应的label。这里我们用xs和ys分别代表图片和对应的label,训练数据集和测试数据集都有xs和ys,使用mnist.train.images和mnist.train.labels表示训练数据集中图片数据和对应的label数据。
如下图所示,它表示由2828的像素点矩阵组成的一张图片,这里的数字784(2828)如果放在我们的神经网络中,它就是x输入的大小,其对应的矩阵如下图所示,类标label为1。

最终MNIST的训练数据集形成了一个形状为55000*784位的tensor,也就是一个多维数组,第一维表示图片的索引,第二维表示图片中像素的索引(tensor中的像素值在0到1之间)。
这里的y值其实是一个矩阵,这个矩阵有10个位置,如果它是1的话,它在1的位置(第2个数字)上写1,其他地方写0;如果它是2的话,它在2的位置(第3个数字)上写1,其他位置为0。通过这种方式对不同位置的数字进行分类,例如用[0,0,0,1,0,0,0,0,0,0]来表示数字3,如下图所示。

mnist.train.labels是一个55000*10的二维数组,如下图所示。它表示55000个数据点,第一个数据y表示5,第二个数据y表示0,第三个数据y表示4,第四个数据y表示1。

知道了MNIST数据集的组成,以及x和y具体的含义,我们就开始编写Keras吧!
二.Keras实现MNIST分类
本文通过Keras搭建一个分类神经网络,再训练MNIST数据集。其中X表示图片,28*28,y对应的是图像的标签。
第一步,导入扩展包。
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop
第二步,载入MNIST数据及预处理。
- X_train.reshape(X_train.shape[0], -1) / 255
将每个像素点进行标准化处理,从0-255转换成0-1的范围。 - np_utils.to_categorical(y_train, nb_classes=10)
调用up_utils将类标转换成10个长度的值,如果数字是3,则会在对应的地方标记为1,其他地方标记为0,即{0,0,0,1,0,0,0,0,0,0}。
由于MNIST数据集是Keras或TensorFlow的示例数据,所以我们只需要下面一行代码,即可实现数据集的读取工作。如果数据集不存在它会在线下载,如果数据集已经被下载,它会被直接调用。
# 下载MNIST数据
# X shape(60000, 28*28) y shape(10000, )
(X_train, y_train), (X_test, y_test) = mnist.load_data() # 数据预处理
X_train = X_train.reshape(X_train.shape[0], -1) / 255 # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 255 # normalize # 将类向量转化为类矩阵 数字 5 转换为 0 0 0 0 0 1 0 0 0 0 矩阵
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
第三步,创建神经网络层。
前面介绍创建神经网络层的方法是定义之后,利用add()添加神经层。
- model = Sequential()
- model.add(Dense(output_dim=1, input_dim=1))
而这里采用另一种方法,在Sequential()定义的时候通过列表添加神经层。同时需要注意,这里增加了神经网络激励函数并调用RMSprop加速神经网络。
- from keras.layers import Dense, Activation
- from keras.optimizers import RMSprop
该神经网络层为:
- 第一层为Dense(32, input_dim=784),它将传入的784转换成32个输出
- 该数据加载一个激励函数Activation(‘relu’),并转换成非线性化数据
- 第二层为Dense(10),它输出为10个单位。同时Keras定义神经层会默认其输入为上一层的输出,即32(省略)
- 接着加载一个激励函数Activation(‘softmax’),用于分类
# Another way to build your neural net
model = Sequential([
Dense(32, input_dim=784), # 输入值784(28*28) => 输出值32
Activation('relu'), # 激励函数 转换成非线性数据
Dense(10), # 输出为10个单位的结果
Activation('softmax') # 激励函数 调用softmax进行分类
]) # Another way to define your optimizer
rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) #学习率lr # We add metrics to get more results you want to see
# 激活神经网络
model.compile(
optimizer = rmsprop, # 加速神经网络
loss = 'categorical_crossentropy', # 损失函数
metrics = ['accuracy'], # 计算误差或准确率
)
第四步,神经网络训练及预测。
print("Training")
model.fit(X_train, y_train, nb_epoch=2, batch_size=32) # 训练次数及每批训练大小
print("Testing")
loss, accuracy = model.evaluate(X_test, y_test)
print("loss:", loss)
print("accuracy:", accuracy)
完整代码:
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 14 16:43:21 2020
@author: Eastmount CSDN YXZ
O(∩_∩)O Wuhan Fighting!!!
"""
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop #---------------------------载入数据及预处理---------------------------
# 下载MNIST数据
# X shape(60000, 28*28) y shape(10000, )
(X_train, y_train), (X_test, y_test) = mnist.load_data() # 数据预处理
X_train = X_train.reshape(X_train.shape[0], -1) / 255 # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 255 # normalize # 将类向量转化为类矩阵 数字 5 转换为 0 0 0 0 0 1 0 0 0 0 矩阵
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10) #---------------------------创建神经网络层---------------------------
# Another way to build your neural net
model = Sequential([
Dense(32, input_dim=784), # 输入值784(28*28) => 输出值32
Activation('relu'), # 激励函数 转换成非线性数据
Dense(10), # 输出为10个单位的结果
Activation('softmax') # 激励函数 调用softmax进行分类
]) # Another way to define your optimizer
rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) #学习率lr # We add metrics to get more results you want to see
# 激活神经网络
model.compile(
optimizer = rmsprop, # 加速神经网络
loss = 'categorical_crossentropy', # 损失函数
metrics = ['accuracy'], # 计算误差或准确率
) #------------------------------训练及预测------------------------------
print("Training")
model.fit(X_train, y_train, nb_epoch=2, batch_size=32) # 训练次数及每批训练大小
print("Testing")
loss, accuracy = model.evaluate(X_test, y_test) print("loss:", loss)
print("accuracy:", accuracy) 运行代码,首先会下载MNIT数据集。
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz
11493376/11490434 [==============================] - 18s 2us/step
接着输出两次训练的结果,可以看到误差不断减小、正确率不断增大。最终测试输出的误差loss为“0.185575”,正确率为“0.94690”。

如果读者想更直观地查看我们数字分类的图形,可以定义函数并显示。

此时的完整代码如下所示:
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 14 16:43:21 2020
@author: Eastmount CSDN YXZ
O(∩_∩)O Wuhan Fighting!!!
"""
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop
import matplotlib.pyplot as plt
from PIL import Image #---------------------------载入数据及预处理---------------------------
# 下载MNIST数据
# X shape(60000, 28*28) y shape(10000, )
(X_train, y_train), (X_test, y_test) = mnist.load_data() #------------------------------显示图片------------------------------
def show_mnist(train_image, train_labels):
n = 6
m = 6
fig = plt.figure()
for i in range(n):
for j in range(m):
plt.subplot(n,m,i*n+j+1)
index = i * n + j #当前图片的标号
img_array = train_image[index]
img = Image.fromarray(img_array)
plt.title(train_labels[index])
plt.imshow(img, cmap='Greys')
plt.show() show_mnist(X_train, y_train) # 数据预处理
X_train = X_train.reshape(X_train.shape[0], -1) / 255 # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 255 # normalize # 将类向量转化为类矩阵 数字 5 转换为 0 0 0 0 0 1 0 0 0 0 矩阵
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10) #---------------------------创建神经网络层---------------------------
# Another way to build your neural net
model = Sequential([
Dense(32, input_dim=784), # 输入值784(28*28) => 输出值32
Activation('relu'), # 激励函数 转换成非线性数据
Dense(10), # 输出为10个单位的结果
Activation('softmax') # 激励函数 调用softmax进行分类
]) # Another way to define your optimizer
rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) #学习率lr # We add metrics to get more results you want to see
# 激活神经网络
model.compile(
optimizer = rmsprop, # 加速神经网络
loss = 'categorical_crossentropy', # 损失函数
metrics = ['accuracy'], # 计算误差或准确率
) #------------------------------训练及预测------------------------------
print("Training")
model.fit(X_train, y_train, nb_epoch=2, batch_size=32) # 训练次数及每批训练大小
print("Testing")
loss, accuracy = model.evaluate(X_test, y_test) print("loss:", loss)
print("accuracy:", accuracy)
教你如何用Keras搭建分类神经网络的更多相关文章
- 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)【转】
本文转载自:https://www.leiphone.com/news/201703/Y5vnDSV9uIJIQzQm.html 生成对抗网络(Generative Adversarial Netwo ...
- 996工作制?不如花点时间学知识!北栀暗影教你如何用WordPress搭建专业网站
很多70后.80后小时候都看过这样一部动画片-<半夜鸡叫>.讲的是地主"周扒皮"为了长工们能多干些活,半夜三更起来学鸡叫让长工劳动(卖身契上规定:鸡叫就得起床干活劳动) ...
- 手把手教你如何用eclipse搭建前端开发环境
3.创建静态web工程 打开eclipse,选择file,new project 或者 new other...,选择web项中的static web project ,next. 输入你的项目名,如 ...
- 教你如何用Nginx搭建一个安全的、快速的微服务架构
今天我们要谈论微服务以及如何使用Nginx构建一个快速的.安全的网络系统.最后,我们将向您展示一个使用Fabric模式如何非常快速和轻松地构建一个微服务的demo. 在我们探讨Fabric模式之前,我 ...
- Keras入门(一)搭建深度神经网络(DNN)解决多分类问题
Keras介绍 Keras是一个开源的高层神经网络API,由纯Python编写而成,其后端可以基于Tensorflow.Theano.MXNet以及CNTK.Keras 为支持快速实验而生,能够把 ...
- 对比学习用 Keras 搭建 CNN RNN 等常用神经网络
Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速, 几条语句就搞定了. 而且广泛的兼容性能使 Keras 在 Windows 和 Ma ...
- CNN实战篇-手把手教你利用开源数据进行图像识别(基于keras搭建)
我一直强调做深度学习,最好是结合实际的数据上手,参照理论,对知识的掌握才会更加全面.先了解原理,然后找一匹数据来验证,这样会不断加深对理论的理解. 欢迎留言与交流! 数据来源: cifar10 (其 ...
- keras搭建神经网络快速入门笔记
之前学习了tensorflow2.0的小伙伴可能会遇到一些问题,就是在读论文中的代码和一些实战项目往往使用keras+tensorflow1.0搭建, 所以本次和大家一起分享keras如何搭建神经网络 ...
- 深度学习实践系列(3)- 使用Keras搭建notMNIST的神经网络
前期回顾: 深度学习实践系列(1)- 从零搭建notMNIST逻辑回归模型 深度学习实践系列(2)- 搭建notMNIST的深度神经网络 在第二篇系列中,我们使用了TensorFlow搭建了第一个深度 ...
- 从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社
从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社 PPT链接: https://pan.baidu.com/s/1i5Jrr1N 视频链接: https: ...
随机推荐
- 放弃老旧的Mybatis,强类型替换字符串,这是一款你不应该错过的ORM
一款轻量级.高性能.强类型.易扩展符合C#开发者的JAVA自研ORM github地址 easy-query https://github.com/xuejmnet/easy-query gitee地 ...
- 如何避免JavaScript中的内存泄漏?
前言 过去,我们浏览静态网站时无须过多关注内存管理,因为加载新页面时,之前的页面信息会从内存中删除. 然而,随着单页Web应用(SPA)的兴起,应用程序消耗的内存越来越多,这不仅会降低浏览器性能,甚至 ...
- SNN_文献阅读_Recent Advances and New Frontiers in Spiking Neural Networks
Recent Advances and New Frontiers in Spiking Neural Networks 基本要素:包括神经元模型.神经元中脉冲序列的编码方法.神经网络中每个基本层的拓 ...
- .NET8依赖注入新特性Keyed services
什么是Keyed service Keyed service是指,为一个需要注入的服务定义一个Key Name,并使用使用Key Name检索依赖项注入 (DI) 服务的机制. 使用方法 通过调用 A ...
- UIPath初识和安装
即使没有人为你鼓掌,也要优雅的谢幕,感谢自己的认真付出. 一. UiPath组成 学习UiPath,我们一定先要了解Studio,Robot和Orchestrator这3个重要组成部分. UiPa ...
- python数值列表之range()和list()
range() 学习了for循环后,显示数字当然也可以很轻松啦,这个时候我们就可以用到range()函数 for list_2 in range(1, 5): print(list_2) range( ...
- js实现按照首字母排序
<script type="text/javascript"> let obj = [{name:'CA'},{name:'XA'},{name:'CB'},{name ...
- Llinux登录后出现-bash-4.2#,解决办法以及造成这样的原因
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 1.原因是root在/root下面的几个配置文件丢失,丢失文件如下: 1..bash_profile 2..bashr ...
- 时间复杂度为 O(n^2) 的排序算法
对于小规模数据,我们可以选用时间复杂度为 O(n2) 的排序算法.因为时间复杂度并不代表实际代码的执行时间,它省去了低阶.系数和常数,仅代表的增长趋势,所以在小规模数据情况下, O(n2) 的排序算法 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-35-处理web页面定位toast-上篇
1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast(出现之后一闪而过,不留下一点点痕迹),那么这个toast我们这边如何 ...