大家好,本期我们将开始一个新的专题的写作,因为有一些小伙伴想了解一下深度学习框架Keras的知识,恰好本人也会一点这个知识,因此就开始尝试着写一写吧。本着和大家一起学习的态度,有什么写的不是很好的地方还请大家多多指教。这里我默认大家已经搭建好了深度学习的实践环境了。
关于什么是深度学习,我这里就不多说明了,大家Google就能知道答案。关于深度学习的框架有很多:Tensorflow、Keras、PyTorch、 MXNet、PaddlePaddle等等,那么为什么我这里就开讲Keras呢,因为它简洁好用啊。
它的简洁在于:Keras是一个高级深度学习API,使用Python语言进行编写的。Keras能够在TensorFlow、Theano或CNTK上运行,这个意思就是Keras的后端引擎可以是这三者之一,用户可以进行显式的选择。重要的是Keras提供了一个简单和模块化的API来构建和训练我们需要的神经网络,比如卷积神经网络,循环神经网络等等。还有一个优点就是使用Keras可以不用关心大部分函数实现的复杂细节,可真的太棒了。
Keras有四个特性:模块性、易扩展、用户友好和基于Python,以下的介绍来自Keras的中文文档。
温馨提示:如果大家对机器学习不清楚的话,可以先学习机器学习的相关知识,这对于本专题的学习是非常有利的。
在跟学习其他语言一样,学习Keras的时候,我们也要学习它的基础知识。深度学习的“Hello World”知识就是使用深度学习来识别手写字识别。在学习之前,我们来看一些其他储备知识:
Numpy、scipy、scikit-learn、matplotlib、pandas、graphviz、pydot、h5py、Theano、Tensofflow、Keras。
安装库的方式比较简单,打开cmd,输入pip install packagename即可。
大家下载库的时候,如果速度很慢,可以修改下载源,本人电脑中文件的
修改路径和修改方式如下,大家根据自己的电脑找到相应的路径:
之前说过,我们可以更换Keras的后端引擎的。本人电脑文件和修改如下:
此时,“backend”:“tensorflow”,可修改tensorflow为Theano. 一般推荐 TensorFlow 后端,大家根据自己的电脑找到相应的路径:
1、 加载数据
深度学习重要的就是数据,那么手写字体的数据是怎样的呢?
我们先看一下这个手写数字体的数据形式:
from
上述使用mnist.load_data()加载文件的方式会在从链接:
https://s3.amazonaws.com/img-datasets/mnist.npz
上下载数据集,控制台的部分输出如下:
这个下载的过程是很漫长的,甚至下载不了这个数据集,因此我们将采用其他的方式进行数据下载:
方法一:先从网络上下载好这个数据集,然后传入文件路径:
from
输出(60000, 28, 28)和(60000,)
方法二:通过numpy来进行搭桥,当然了也要事先下载好数据集:
# 加载keras包含的mnist的数据集
X_train.shape 的形状为(60000, 28, 28)
y_train.shape的形状为(60000,)
X_test.shape的形状为(10000, 28, 28)
y_test.shape的形状为(10000,)
可以看到每条样本是一个28*28的矩阵(毕竟是图片),共有训练数据60000个,测试数据10000个,y_train和y_test是诸如这样的列表[7 2 1 ... 4 5 6],其中数字代表每个数据样本的真实值。
2、 数据样本展示
我们可以通过代码来查看一下样本的真实样貌:
from
输出显示如下:可以看出每一个样本的是gray形式的图片,像素的灰度值在[0,255]
接下来我们的工作就是在训练集(X_train和y_train)上训练我们识别手写字体的模型,在测试集上进行测试。
3、 重塑维度并归一化
由于我们的任务是进行识别,实际上也就是进行分类,因此我们有必要对数据进行归一化的操作。另外由于X_train.shape 的形状为(60000, 28, 28),也就是说样本是二维形状的数据,在识别的时候是不好处理的,因此我们将数据转换一维,并进行归一化的处理。具体做法如下:
from
输出: (60000, 784)和(10000, 784)
如果大家知道这个样本(图像的大小,如28*28),那么饿哦们可以使用另外一个方法进行reshape操作:
X_train
两者效果是等效的,大家可以查看reshape函数的功能,就能明白这是为什么了。
归一化的操作很简单,我们根据像素值的范围进行归一化,我们先看看数据的类型:
print
他们是uint8型的,由于要进行归一化,归一化的数据是float32类型的,因此我们将使用astype()进行转换,转换后进行归一化:
X_train
之前我们说到标签数据(也就是样本的真实类别)y_train和y_test是诸如这样的列表[7 2 1 ... 4 5 6],我们在此需要进行One-hot encoding的操作,不懂One-hot encoding编码的同学可以查阅下资料:
from
至此我们的数据就处理结束了,接下来我们来搭建神经网络模型并训练。
4、 构建模型
关于这一步骤,我先给出构建模型的代码,然后在进行解释:
1
上述代码中:
可以看出在测试集上的精度要比训练集上的精度高,这说明我们训练的模型过拟合了,过拟合是指机器学习模型在新数据上的性能往往比在训练数据上要差。
至此,我们就完成了使用Keras完成了深度学习的“Hello World”项目,后期我们将构建卷积神经网络来进一步提升模型的精度。有兴趣的小伙伴可以自己画一个样本,然后进行识别。
构建训练模型的整个代码如下:
from
Keras实现一个深度学习的模型还是非常简单的,对于Keras大家是不是有点了解了呢?学习Keras最重要的就是需要多写,多看官方的API。当然了最重要的是大家要有机器学习或者深度学习的一些理论基础。下次推文我们来介绍Keras中的模型的种类,即Sequential 顺序模型和Model 模型。