在scikit-learn中通过堆叠RBMs创建深度信念网络

根据这个网站的介绍,深度信念网络就是将多个RBMs堆叠在一起,使用前一个RBM的输出作为下一个RBM的输入。enter image description here

在scikit-learn的文档中,有一个使用RBM对MNIST数据集进行分类的例子。他们将一个RBM和一个LogisticRegression放在一个管道中,以获得更好的准确性。

因此,我想知道我是否可以在这个管道中添加多个RBM来创建如以下代码所示的深度信念网络。

from sklearn.neural_network import BernoulliRBMimport numpy as npfrom sklearn import linear_model, datasets, metricsfrom sklearn.model_selection import train_test_splitfrom sklearn.pipeline import Pipelinedigits = datasets.load_digits()X = np.asarray(digits.data, 'float32')Y = digits.targetX = (X - np.min(X, 0)) / (np.max(X, 0) + 0.0001)  # 0-1 scalingX_train, X_test, Y_train, Y_test = train_test_split(X, Y,                                                    test_size=0.2,                                                    random_state=0)logistic = linear_model.LogisticRegression(C=100)rbm1 = BernoulliRBM(n_components=100, learning_rate=0.06, n_iter=100, verbose=1, random_state=101)rbm2 = BernoulliRBM(n_components=80, learning_rate=0.06, n_iter=100, verbose=1, random_state=101)rbm3 = BernoulliRBM(n_components=60, learning_rate=0.06, n_iter=100, verbose=1, random_state=101)DBN3 = Pipeline(steps=[('rbm1', rbm1),('rbm2', rbm2), ('rbm3', rbm3), ('logistic', logistic)])DBN3.fit(X_train, Y_train)print("Logistic regression using RBM features:\n%s\n" % (    metrics.classification_report(        Y_test,        DBN3.predict(X_test))))

然而,我发现管道中添加的RBM越多,准确性就越低。

管道中1个RBM –> 95%

管道中2个RBM –> 93%

管道中3个RBM –> 89%

下面的训练曲线显示,100次迭代刚好达到收敛。更多的迭代会导致过拟合,可能性会再次下降。

批量大小 = 10

enter image description here

批量大小 = 256或以上

我注意到一个有趣的事情。如果我使用更高的批量大小,网络的性能会大幅下降。当批量大小超过256时,准确性下降到仅10%以下。训练曲线对我来说有些不合理,第一和第二个RBM学得不多,但第三个RBM突然学得很快。enter image description here

看起来89%似乎是拥有3个RBM的网络的瓶颈。

我想知道我是否在这里做错了什么。我对深度信念网络的理解正确吗?


回答:

以下内容并不是一个完全确定的答案,因为它缺乏任何统计上的严谨性。然而,必要的参数优化和评估仍然需要几天的时间来进行CPU计算。在此之前,我提交以下原理证明作为答案。

简而言之

更大的层 + 更长的训练时间 => 仅使用逻辑回归的性能 < + 1个RBM层 < + RBM堆叠/深度信念网络

引言

正如我在对原始帖子的评论中所述,堆叠RBMs/深度信念网络用于无监督预训练已在Erhan等人(2010年)中系统地探索过。准确地说,他们的设置与原始帖子的设置有所不同,因为在训练深度信念网络后,他们添加了一层输出神经元,并使用反向传播对整个网络进行微调。原始帖子通过在最终层的输出上使用逻辑回归的性能来评估添加一个或多个RBM层的益处。此外,Erhan等人并没有使用scikit-learn中的64像素digits数据集,而是使用了784像素的MNIST图像(及其变体)。

尽管如此,相似性足够大,可以将他们的发现作为评估scikit-learn实现的深度信念网络的起点,我正是这样做的:我也使用了MNIST数据集,并且使用了Erhan等人报告的最佳参数(如果有报告)。这些参数与原始帖子示例中给出的参数有很大不同,并且可能是原始帖子模型性能不佳的原因:特别是,层的大小要大得多,训练样本的数量要大几个数量级。然而,像原始帖子一样,我在管道的最后一步使用逻辑回归来评估RBM或RBM堆叠/深度信念网络对图像变换是否能提高分类性能。

顺便说一下,RBM层中拥有(大概)与原始图像(784像素)同样多的单元(800个单元),也使得对原始图像像素进行纯粹的逻辑回归成为一个合适的基准模型。

因此,我比较了以下三个模型:

  1. 仅使用逻辑回归(即基准/基准模型),

  2. 在RBM的输出上使用逻辑回归,以及

  3. 在RBM堆叠/深度信念网络的输出上使用逻辑回归。

结果

与之前的文献一致,我的初步结果确实表明,使用RBM的输出进行逻辑回归的性能比仅使用原始像素值本身要好,而深度信念网络的变换在RBM的基础上进一步改善,尽管改善幅度较小。

仅使用逻辑回归:

模型性能:             精确度    召回率  F1分数   支持量        0.0       0.95      0.97      0.96       995        1.0       0.96      0.98      0.97      1121        2.0       0.91      0.90      0.90      1015        3.0       0.90      0.89      0.89      1033        4.0       0.93      0.92      0.92       976        5.0       0.90      0.88      0.89       884        6.0       0.94      0.94      0.94       999        7.0       0.92      0.93      0.93      1034        8.0       0.89      0.87      0.88       923        9.0       0.89      0.90      0.89      1020平均/总计       0.92      0.92      0.92     10000

Related Posts

Flatten and back keras

我正在尝试使用自编码器获取简单向量中的值 这是我的代码…

如何按索引访问PyTorch模型参数

如果我的网络有10层,包括偏置项,如何仅通过索引访问第…

Python中多元逻辑回归显示错误

我试图使用逻辑回归进行预测,并使用Python和skl…

在MACOS上安装NLTK

我在我的2015款Mac Pro上尝试安装NLTK,操…

如何在R中将通过RFE选择的变量插入到机器学习模型中?

我想使用递归特征消除方法来选择最重要的特征,然后将这些…

CountVectorizer 错误:ValueError: setting an array element with a sequence

我有一个包含144条学生反馈的数据集,其中有72条正面…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注