1

I am trying to implement Probabilistic Matrix Factorization with Stochastic Gradient Descent updates, in theano, without using a for loop.

I have just started learning the basics of theano; unfortunately on my experiment I get this error:

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.

The source code is the following:

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)

I realize that it's a rather unconventional way to use theano.scan: do you have a suggestion on how I could implement my algorithm better?

The main difficulty lies on the updates: a single update depends on possibly all the previous updates. For this reason I defined the latent matrices U and V as shared (I hope I did that correctly).

The version of theano I am using is: 0.8.0.dev0.dev-8d6800181bedb03a4bced4f456338e5194524317

Any hint and suggestion is highly appreciated. I am available to provide further details.

fstab
  • 4,801
  • 8
  • 34
  • 66

0 Answers0