当前位置: 首页 > 文档资料 > Python 机器学习 >

13.3 使用Keras提高训练神经网络的效率

优质
小牛编辑
123浏览
2023-12-01

在本节,我们将讨论一下Keras,它是一个最近开发的用于促进神经网络训练的库。Keras的开发始于2015年年初,时至今日,它已经发展成为构建在Theano之上的最流行、应用最广泛的库,通过Keras,我们可以使用GPU来加速神经网络的训练。Keras的一个突出特性在于它提供了一个非常直观的API,这让我们通过简单的几行代码实现神经网络成为了可能。安装好Theano后,读者可以在命令行终端窗口中通过下面的命令从PyPI中安装Keras:

关于Kears的更多信息,请访问其官方网站:http://keras.io

为了解如何通过Keras进行神经网络的训练,我们来实现一个多层感知器,用于识别前面章节中用到的MNIST数据集中的手写数字。MNIST数据集分为四个部分,可通过链接http://yann.lecun.com/exdb/mnist/进行下载:

·train-images-idx3-ubyte.gz:训练集图片(9912422字节)

·train-labels-idx1-ubyte.gz:训练集图片对应的类标(28881字节)

·t10k-images-idx3-ubyte.gz:测试集图片(1648877字节)

·t10k-labels-idx1-ubyte.gz:测试集图片对应的类标(4542字节)

解压下载的压缩包,将得到的文件都放置在当前工作目录下的mnist目录中,这样我们就可以使用下列函数加载训练和测试数据集:

在后面的几页中,我们将使用代码示例逐步讲解Keras的使用过程,读者可以在Python解释器中直接输入并执行这些代码。不过,如果读者想要在GPU上训练神经网络,可以将这些代码输入到一个脚本中,或者从Packt出版社的官网[1]下载相关代码。为了在GPU上运行Python脚本,请在mnist_keras_mlp.py文件所在目录执行如下命令:

继续训练数据前的准备工作,现在我们将MNIST图像的数组转换为32位浮点数格式:

接下来,我们将类标(数字0~9)转换为独热码格式。幸运的是,Keras提供了一个便捷的工具来完成格式的转换:

现在,我们来到了最有趣的环节:实现一个神经网络。这里使用了与第12章中相同的神经网络结构。不过,我们在隐层和输出层分别使用了双曲正切函数和softmax函数作为激励函数,以替代原来的逻辑斯谛函数同时还额外增加了一个隐层。正如下列代码所示,Keras使得神经网络的实现变得非常简单:

我们首先使用Sequential类初始化了一个模型来实现前馈神经网络。接下来,我们可以根据需要加入任意数量的层。不过,由于加入的第一个层是输入层,我们必须保证input_dim属性的值与训练集中特征的数量(列)相匹配(在本例中为768)。同时,我们还须保证上一层的输出单元数量(output_dim)与下一层的输入单元数量(input_dim)相匹配。在前面的例子中,我们加入了两个隐层,每个隐层都包含50个隐藏单元及一个偏置单元。请注意,与第12章中将多层感知器的偏置单元默认设置为1(常见但不一定是最好的设置)不同,Keras将全连接网络的偏置单元初始化设置为0。

最后,输出层中单元数量应与类标类别的数量相同(有多少类型的类标就有多少个输出单元)——也就是使用独热码表示的类标数组中列的数量。在编译模型之前,我们还须定义一个优化器。在上面的例子中,我们选择通过随机梯度下降进行优化,该方式在前面章节已相当熟悉。此外,与第12章中讨论的方法类似,我们可以通过设置训练过程中权重衰减常数与动量学习的值来调整迭代过程中学习的速率。最后,我们将代价(损失)函数设置为categorical_crossentropy。这个(二进制)交叉熵是与逻辑斯谛回归中代价函数相关的一个技术术语。此交叉熵是通过softmax激励函数对多类别分类的泛化。在完成模型的编译后,我们就可以通过调用fit方法来对其进行训练。在此,我们使用了子批次随机梯度,每个子批次中包含300个训练样本。我们通过50次迭代完成多层感知器的训练,通过将verboses的值设置为1,我们便可看到通过代价函数进行优化的训练进度。validation_split参数使用起来也非常方便,它会在每次迭代中预留训练样本(本例中是6000个)的10%,并在迭代后使用这些样本进行验证,这样我们就可以检查模型在训练过程中是否过拟合。

在训练过程中显示代价函数的值也是非常有用的,这样我们就可以迅速发现训练过程中代价是否呈下降趋势,否则便可提前终止算法并对超参的值进行调优。

为了完成类标的预测,我们可以使用predict_classes方法直接以整数的形式返回类标:

最后,我们看一下模型在训练和测试集上的准确率:

请注意,这里我们只是实现了一个不带参数调优的简单神经网络。如果读者对Keras感兴趣,可通过进一步调节学习速率、动量、权重衰减以及隐层元素的数量等参数对神经网络调优。

Keras是实现神经网络并进而对其进行实验的一个优秀的库,但还有许多其他封装了Theano的库也值得一提。特别是Pylearn2(http://deeplearning.net/software/pylearn2/),它由位于蒙特利尔的LISA实验室所开发。如果读者喜欢简约一点的扩展库,那么Lasagne(https://github.com/Lasagne/Lasagne)也许会引起你的注意,它基于Theano开发,可通过此框架更好地控制Theano。

[1] http://www.packtpub.com