如何在简单的概率矩阵分解算法的SGD更新中使用属性theano.scan?

时间:2016-06-08 12:36:10

标签: python matrix machine-learning theano theano.scan

我正在尝试在theano中使用Probabilistic Matrix Factorization更新实现Stochastic Gradient Descent,而不使用for循环。

我刚刚开始学习theano的基础知识;不幸的是,在我的实验中,我收到了这个错误:

GridView

源代码如下:

UnusedInputError: theano.function was asked to create a function
    computing outputs given certain inputs, but the provided input
    variable at index 0 is not part of the computational graph needed
    to compute the outputs: trainM.

我意识到使用def create_training_set_matrix(training_set): return np.array([ [_i,_j,_Rij] for (_i,_j),_Rij in training_set ]) def main(): R = movielens.small() U_values = np.random.random((config.K,R.shape[0])) V_values = np.random.random((config.K,R.shape[1])) U = theano.shared(U_values) V = theano.shared(V_values) lr = T.dscalar('lr') trainM = T.dmatrix('trainM') def step(curr): i = T.cast(curr[0],'int32') j = T.cast(curr[1],'int32') Rij = curr[2] eij = T.dot(U[:,i].T, V[:,j]) T.inc_subtensor(U[:,i], lr * eij * V[:,j]) T.inc_subtensor(V[:,j], lr * eij * U[:,i]) return {} values, updates = theano.scan(step, sequences=[trainM]) scan_fn = function([trainM, lr],values) print "training pmf..." for training_set in cftools.epochsloop(R,U_values,V_values): training_set_matrix = create_training_set_matrix(training_set) scan_fn(training_set_matrix, config.lr) 这是一种非常规的方式:你对如何更好地实现我的算法有什么建议吗?

主要困难在于更新:单个更新可能取决于所有以前的更新。出于这个原因,我将潜在矩阵theano.scanU定义为 shared (我希望我能正确地做到这一点)。

我正在使用的theano版本是: 0.8.0.dev0.dev-8d6800181bedb03a4bced4f456338e5194524317

任何提示和建议都非常感谢。我可以提供更多详细信息。

0 个答案:

没有答案