深度置信网络与MNIST数据集教程

深度置信网络(DBN)可以定义为一系列堆叠起来的受限玻尔兹曼机(RBM,介绍见此处),每个RBM层都与其前后的层进行通信。单个层中的节点之间不会横向通信。

深度置信网络可以直接用于处理无监督学习中的未标记数据聚类问题,也可以在RBM层的堆叠结构最后加上一个Softmax层来构成分类器。

除了第一个和最后一个层,深度置信网络中的每一层都扮演着双重角色:既是前一层节点的隐藏层,也是后一层节点的输入(或“可见”)层。深度置信网络是由多个单层网络组成的。

深度置信网络常用于图像、视频序列和动作捕捉数据的识别、聚类与生成。连续型深度置信网络是深度置信网络的一种扩展,它接受连续的十进制数据,而非二进制数据。此类网络由Geoff Hinton和他的学生于2006年提出。


用深度置信网络处理MNIST数据集

对于图像识别和DBN的探索可以从MNIST数据集开始。第一步是从数据集中提取一幅图像并将其二进制化,即把图像的像素从连续的灰度数据转换为零和一。每个灰度值大于35的像素变为1,其他则变为0。MNIST数据集迭代器类可以完成这一操作。


超参数

所有多层网络通用的参数见此处

变量k表示对比散度算法的运行次数。对比散度算法每运行一次,就是一个马尔可夫链的样本。构成一个深度置信网络时,k的值通常为1


深度置信网络的初始化

初始化操作由DataSetIterator类的具体形式MnistDataSetIterator完成。

我们通常用DataSetIterator来处理输入数据,完成数据集所特有的二进制化和标准化等操作。处理MNIST数据集时,以下这行代码将指定批次大小和样例数量——用户通过这两项参数来设定定型所使用的样例有多少(样例更多一般会提高模型的准确率,也会增加定型时间):


//用60000个样例定型,每批次100个样例
     DataSetIterator iter = new MnistDataSetIterator(100,60000);

MnistDataSetIterator遍历输入数据。(完整的示例参见此处,您也可以下载DL4J的示例库来获取这个例子。)

MultiLayerConfiguration设置由RBM层组成的DBN网络:

调用fit方法,定型模型:

注意此处将eval类与混淆矩阵和F1值结合使用,实现可视化的数据评估。这可以用于监测网络定型表现随时间变化的情况。

F1值以百分比形式表示,基本上相当于神经网络作出准确预测的概率。要提高神经网络的性能,您可以对网络进行调试,改变隐藏层的数量和规模,调整学习速率、动量、权重分布、正则化方法等其他参数。

接下来我们要介绍如何用分布式和多线程计算来提高网络的定型速度。如果您想了解另一类深度网络——深度自动编码器,请点击此处


其他Deeplearning4j教程

与我们在Gitter聊天