Реализация пользовательских операций для RBM/DBN с tenorflow?

Так как Google выпустил тензорный поток, это становится своего рода тенденцией в текущих выборках глубокого обучения.

Я хотел бы провести несколько экспериментов с RBM/DBN (ограниченная машина Больцмана /Deep Belief Network), я предпринял некоторую попытку сам и вроде как реализовал ее с помощью комбинации доступных API-интерфейсов от tenorflow. Смотрите код и предыдущий ответ.

Итак, если не беспокоит производительность кода, вот подарок для реализации RBM / DBN с tenorflow.

Но ходовые характеристики должны быть учтены в будущем. Из-за особого прогресса алгоритма CD (Contrastive Divergence), я думаю, он просто работает против структуры (графа потока данных), используемой тензорным потоком. Вот почему мой код кажется устаревшим.

Итак, пользовательская операция должна быть реализована для ускорения. Я следил за текущей документацией о добавлении пользовательских операций.

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 (просто сигмоид (X*W+hb)), его градиент должен возвращать как минимум градиенты за последние 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})

Но библиотека tenorflow слишком сложна для меня. И после слишком много времени в поисках того, как реализовать эти существующие операции (sigmoid, matmul, ma_add, relu, random_uniform) в пользовательской операции не найдено ни одного решения.

Итак, я хотел бы спросить, может ли кто-нибудь помочь мне выполнить оставшиеся работы.

PS: прежде чем получить некоторые идеи, я хотел бы погрузиться в Theano поскольку он уже реализует RBM / DBN. Просто на мой взгляд, Caffe вид не подходит для RBM / DBN из-за его структуры.

Обновление: после изучения учебников от Theano, я обнаружил, что основная причина, по которой Theano реализовал RBM / DBN, а тензорный поток - нет scan технология. Таким образом, может быть, что тензорный поток для реализации scan технология подготовки к внедрению RBM / DBN.

0 ответов

Другие вопросы по тегам