Реализация пользовательских операций для 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.