我正在尝试在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.scan
和U
定义为 shared (我希望我能正确地做到这一点)。
我正在使用的theano版本是: 0.8.0.dev0.dev-8d6800181bedb03a4bced4f456338e5194524317
任何提示和建议都非常感谢。我可以提供更多详细信息。