请求示例:python 中的无监督深度学习

Example Request: unsupervised deep learning in python

上下文

我对神经网络比较陌生,想了解能够class预测学习表示之后的聚类方法。

autoencoders/rbms/deep 信念网络的一些在线教程通常有一个 监督 fit() 调用,例如 fit(X,y) 或 Pipeline(rbm, logistic)。看: http://www.pyimagesearch.com/2014/09/22/getting-started-deep-learning-python/

http://scikit-learn.org/stable/auto_examples/neural_networks/plot_rbm_logistic_classification.html

我想探索隐藏层对未标记数据的影响,因此像 k-means 这样的算法是不够的。

请求

很高兴看到一个 Python 示例调用类似于 fit(X) 和 predict(Y),其中 X 和 Y 是 未标记 数据集.这个想法是 predict() 通过找到一个 'closest' class 来运行,这个 'closest' class 是由在 fit().

中学习到的表征所决定的。

我当然不希望有完整的实现,但希望能提供相关资源。

比如http://deeplearning.net/tutorial/DBN.html,好像可以建一个DBN。有对应的predict()方法吗?

附录

一个有点相关的问题:

Getting the learned representation of the data from the unsupervised learning in pylearn2

在 python 深度学习包中,您通常必须首先定义模型的架构,然后对其进行训练 (fit)。

我能想到的最简单的自动编码器应用是在keras中

您首先需要定义隐藏(压缩)表示的大小。

hidden_dim = 32

进行必要的导入

from keras.layers import Input, Dense
from keras.models import Model

然后定义模型的架构

input = Input(shape=(xxx,))
encode = Dense(hidden_dim, activation='relu')(input)
decode = Dense(xxx, activation='sigmoid')(encode)

autoencoder = Model(input, decode)

上面的xxx就是你输入的维度。例如,如果您想在 MNIST 数据集(具有 28x28 图像)上训练自动编码器,则 xxx 将为 28x28=784.

现在用你选择的成本函数和优化器编译你的模型

autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

现在要训练您的无监督模型,您应该放置相同的图像作为输入和输出。有些方法还会给输出增加噪音,但我会把它留给你。假设 X 是您的训练数据,X_val 是您的验证数据。根据需要调整超参数。

autoencoder.fit(X, X, epochs=100, batch_size=32, shuffle=True, validation_data=(X_val, X_val)

然后假设你有一个名为 X_test 的测试集,你可以让你的模型尝试重现它。

y_hat = autoencoder.predict(X_test)

TL;DR
它比 sklearn 更难做,但基本步骤是:

  • 定义您的网络架构(层、激活、形状等)
  • 编译模型(定义成本函数和优化器)
  • 根据数据拟合模型(同时定义训练参数)
  • 根据测试输入预测输出。

获取内部表示

为了现在回答你的第二个问题,你需要分别定义编码器和解码器

 encoder = Model(input, encode)
 encoded_input = Input(shape=(hidden_dim,))
 decoder_layer = autoencoder.layers[-1]
 decoder = Model(encoded_input, decoder_layer(encoded_input))

现在只需通过您的编码器和解码器

传递一个测试输入(我们称之为原始
hidden_representation = encoder.predict(original)
recreation = decoder.predict(hidden_representation)

您还可以使用隐藏表示甚至编码层来生成另一种算法(例如监督算法)的输入