自从 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 实施做准备。