由于谷歌发布了张量流,因此它在当前的深度学习选择中成为一种趋势。
我想做一些关于RBM / DBN(限制玻尔兹曼机器/深度信念网络)的实验,我自己做了一些尝试,通过结合来自tensorflow的可用API,很好地实现了它。请参阅code和previous answer。
因此,如果不打扰代码运行性能,这里是使用tensorflow实现RBM / DBN的礼物。
但是,未来必须考虑运行性能。由于CD(Contrastive Divergence)算法的特殊进步,我认为它只适用于tensorflow使用的框架(数据流图)。这就是为什么我的代码似乎已经成熟了。
因此,应该实施自定义操作以加速。我已按照当前的documentation关于添加自定义操作。
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)),其渐变应该至少返回 last 3 Variables
的渐变。
想象一下像这样的psuedo代码:
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})
但是张量流库对我来说太复杂了。经过太多时间寻求如何在自定义操作中实现这些现有操作(sigmoid
,matmul
,ma_add
,relu
,random_uniform
),没有解决方案是我自己找到的。
所以,我想问一下是否有人可以帮我实现剩下的工作。
PS:在得到一些想法之前,我想深入研究Theano
,因为它已经实现了RBM / DBN。在我看来,由于它的框架,Caffe
有点不适合RBM / DBN。
更新:经过Theano的教程后,我发现了Theano实现RBM / DBN的关键原因,而张量流不是scan
技术。因此,可能需要等待tensorflow来实现scan
技术以准备RBM / DBN实现。