具有张量流的RBM / DBN的自定义操作实现?

时间:2016-02-25 08:53:17

标签: theano tensorflow deep-learning rbm dbn

由于谷歌发布了张量流,因此它在当前的深度学习选择中成为一种趋势。

我想做一些关于RBM / DBN(限制玻尔兹曼机器/深度信念网络)的实验,我自己做了一些尝试,通过结合来自tensorflow的可用API,很好地实现了它。请参阅codeprevious 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应该是以visibleweightsh_biasv_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})

但是张量流库对我来说太复杂了。经过太多时间寻求如何在自定义操作中实现这些现有操作(sigmoidmatmulma_addrelurandom_uniform),没有解决方案是我自己找到的。

所以,我想问一下是否有人可以帮我实现剩下的工作。

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

更新:经过Theano的教程后,我发现了Theano实现RBM / DBN的关键原因,而张量流不是scan技术。因此,可能需要等待tensorflow来实现scan技术以准备RBM / DBN实现。

0 个答案:

没有答案