1

自从 Google 发布了 tensorflow 之后,它就成为了当前深度学习选择的一种趋势。

我想做一些关于 RBM/DBN(受限玻尔兹曼机/深度信念网络)的实验,我自己做了一些尝试,并通过 tensorflow 中可用 API 的组合很好地实现了它。请参阅代码先前的答案

所以,如果不影响代码运行性能,这里是使用 tensorflow 实现 RBM/DBN 的礼物。

但是,必须考虑未来的运行性能。由于CD(Contrastive Divergence)算法的特殊进步,我认为它只是针对tensorflow使用的框架(数据流图)。这就是为什么我的代码看起来很奇怪。

因此,应该实现自定义操作以进行加速。我遵循了有关添加自定义操作的当前文档。

REGISTER_OP("NaiveRbm")
    .Input("visible: float32")
    .Input("weights: float32")
    .Input("h_bias: float32")
    .Input("v_bias: float32")
    .Output("hidden: float32")
    .Doc(R"doc(
Naive Rbm for seperate training use. DO NOT mix up with other operations
)doc");

在我的设计中,NaiveRbm应该是一个将visible, weights, h_bias,v_bias作为输入的操作,但只输出3 个Variables(简单的 sigmoid(X*W+hb) ),它的梯度应该至少返回最后3 个的梯度Variables

想象一下这样的示例伪代码:

X = tf.placeholder()
W1, hb1, vb1 = tf.Variable()
W2, hb2, vb2 = tf.Variable()
rbm1 = NaiveRbm(X,W1,hb1,vb1)
train_op = tf.train.MomentumOptimizer(0.01, 0.5).minimize(rbm1)
rbm2 = NaiveRbm(tf.stop_gradient(rbm1), W2, hb2, vb2)
train_op2 = tf.train.MomentumOptimizer(0.01, 0.5).minimize(rbm2)
with tf.Session() as sess:
    for batch in batches:
        sess.run(train_op, feed_dict={X: batch})
    for batch in batches:
        sess.run(train_op2, feed_dict={X: batch})

但是tensorflow库对我来说太复杂了。并且经过太多时间寻找如何在自定义操作中实现这些现有操作(sigmoid, matmul, ma_add, relu, random_uniform),我自己没有找到解决方案。

所以,我想问问是否有人可以帮助我完成剩下的工作。

PS:在得到一些想法之前,我想深入研究一下,Theano因为它已经实现了 RBM/DBN。只是在我看来,Caffe由于它的框架,它有点不适合 RBM/DBN。

更新:通过 Theano 的教程从头开始,我发现 Theano 实现 RBM/DBN 而 tensorflow 没有实现的关键原因是scan技术。因此,可能会等待 tensorflow 实施scan技术,为 RBM/DBN 实施做准备。

4

0 回答 0