You seem to redefine self.W1 (for instance) to depend on uu, so when you
use it in the second part, you need uu as an input variable.
On Sun, Jul 24, 2016, shashank gupta wrote:
> Hi,
>
> I am trying to build a model using the following definition:
>
> class user2vec(object):
> def __init__(self, n_user, d, h, n_item):
> self.n_user = n_user
> self.d = d
> self.h = h
> self.n_item = n_item
> # Shared parameter (user embedding vector)
> self.Wu = theano.shared(np.random.uniform(low = -
> np.sqrt(6.0/float(n_user + d)),\
> high = np.sqrt(6.0/float(n_user + d)),\
>
> size=(n_user,d)).astype(theano.config.floatX))
> # Item embedding matrix
> self.Wi = theano.shared(np.random.uniform(low = -
> np.sqrt(6.0/float(n_item + d)),\
> high = np.sqrt(6.0/float(n_item + d)),\
> size=(n_item
> ,d)).astype(theano.config.floatX))
>
> self.W1 = self.Wu
> self.W2 = self.Wi
>
> # Paramters for user-user model
> self.Wm1 = theano.shared(np.random.uniform(low=-np.sqrt(6.0/float(h
> + d)),
> high = np.sqrt(6.0/float(h+d)),
>
> size=(h,d)).astype(theano.config.floatX))
> self.Wp1 = theano.shared(np.random.uniform(low= -
> np.sqrt(6.0/float(h + d)),
> high = np.sqrt(6.0/float(h+d)),
>
> size=(h,d)).astype(theano.config.floatX))
> # Param for single example model
> self.b11 = theano.shared(np.zeros((h), dtype=theano.config.floatX))
> # Param for batch model
> self.B11 = theano.shared(np.zeros((h,1),
> dtype=theano.config.floatX), broadcastable=(False, True))
>
> # Param for single example model
> self.b21 = theano.shared(np.zeros((2), dtype=theano.config.floatX))
> # Param for batch model
> self.B21 = theano.shared(np.zeros((2,1),
> dtype=theano.config.floatX), broadcastable=(False, True))
>
> self.U1 = theano.shared(np.random.uniform(low= -
> np.sqrt(6.0/float(2 + h)),\
> high = np.sqrt(6.0/float(2 +
> h)),
>
> size=(2,h)).astype(theano.config.floatX))
>
> # Parameters for user-item model
> self.Wm2 = theano.shared(np.random.uniform(low=-np.sqrt(6.0/float(h
> + d)),
> high = np.sqrt(6.0/float(h+d)),
>
> size=(h,d)).astype(theano.config.floatX))
> self.Wp2 = theano.shared(np.random.uniform(low= -
> np.sqrt(6.0/float(h + d)),
> high = np.sqrt(6.0/float(h+d)),
>
> size=(h,d)).astype(theano.config.floatX))
> self.b12 = theano.shared(np.zeros((h), dtype=theano.config.floatX))
> # Mini batch model param
> self.B12 = theano.shared(np.zeros((h,1),
> dtype=theano.config.floatX), broadcastable=(False, True))
>
>
> #elf.b22 = theano.shared(np.zeros((2), dtype=theano.config.floatX))
> # Mini batch model param
> #elf.B22 = theano.shared(np.zeros((2), dtype=theano.config.floatX),
> broadcastable=(False, True))
>
> self.U2 = theano.shared(np.random.uniform(low= -
> np.sqrt(6.0/float(2 + h)),\
> high = np.sqrt(6.0/float(2 +
> h)),
>
> size=(1,h)).astype(theano.config.floatX))
>
> self.params1 = [self.Wm1, self.Wp1, self.b11, self.b21, self.U1]
> self.Params1 = [self.Wm1, self.Wp1, self.B11, self.B21, self.U1]
>
> self.params2 = [self.Wm2, self.Wp2, self.b12, self.U2]
> self.Params2 = [self.Wm2, self.Wp2, self.B12, self.U2]
>
> def model_batch(self, lr=0.01):
> # U-U model
> # theano matrix storing node embeddings
> uu = T.imatrix()
> # Target labels for input
> yu = T.ivector()
> # Extract the word vectors corresponding to inputs
> U = self.W1[uu[:, 0],:]
> V = self.W1[uu[:, 1],:]
> #self.debug = theano.function([X], [U,V])
> hLm = U * V
> hLp = abs(U - V)
> hL = T.tanh(T.dot(self.Wm1, hLm.T) + T.dot(self.Wp1, hLp.T) +
> self.B11)
> #param = [U , V]
> #params.extend(self.params)
> # Likelihood
> l = T.nnet.softmax(T.dot(self.U1, hL) + self.B21)
> #cost = T.sum(T.nnet.binary_crossentropy(l, yu))
> cost = -T.mean(T.log(l[:, yu]))
> #cost = - T.sum(T.log(l + eps))
> #self.debug1 = theano.function([X,y], l)
> grad1 = T.grad(cost, [U,V])
> grads = T.grad(cost, self.Params1)
> #updates1 = [(self.W1, T.inc_subtensor(self.W[X[:, 0]], grads[0]))]
> #updates2 = [(self.W, T.inc_subtensor(self.W1[X[:, 1]], grads[1]))]
> self.W1 = T.set_subtensor(self.W1[uu[:,0], :], self.W1[uu[:,0], :]
> - lr * grad1[0])
> self.W1 = T.set_subtensor(self.W1[uu[:,1], :], self.W1[uu[:,1], :]
> - lr * grad1[1])
> updates11 = [(self.Wu, self.W1)]
> updates31 = [(param, param - lr * grad) for (param, grad) in
> zip(self.Params1, grads)]
> updates1 = updates11 + updates31
> self.uu_batch = theano.function([uu,yu], cost, updates=updates1)
> #mode=NanGuardMode(nan_is_error=True, inf_is_error=True, big_is_error=True))
>
> # U-I model
> ui = T.imatrix()
> yi = T.vector()
>
> U1 = self.W1[ui[:, 0], :]
> I = self.W2[ui[:, 1], :]
>
> hLm1 = U1 * I
> hLp1 = abs(U1 - I)
> hL1 = T.tanh(T.dot(self.Wm2, hLm1.T) + T.dot(self.Wp2, hLp1) +
> self.B12)
> l1 = T.dot(self.U2, hL1)
> cost1 = T.mean((l1 - yi) ** 2)
> grad2 = T.grad(cost1, [U1, I])
> grads1 = T.grad(cost1, self.Params2)
> #print grads1
> self.W1 = T.set_subtensor(self.W1[ui[:, 0], :], self.W1[ui[:, 0],
> :] - lr * grad2[0])
> self.W2 = T.set_subtensor(self.W2[ui[:, 1], :], self.W2[ui[:, 1],
> :] - lr * grad2[1])
>
> updates21 = [(self.Wu, self.W1)]
> updates22 = [(self.Wi, self.W2)]
> updates23 = [(param, param - lr * grad) for (param, grad) in
> zip(self.Params2, grads1)]
> #pdb.set_trace()
> updates2 = updates21 + updates22 + updates23
> self.ui_batch = theano.function([ui, yi], cost1, updates=updates2)
>
>
>
>
> When this model is compiled it gives the following error :
>
> File "/home/shashank/SIEL/Trust_network_embedding/social2vec/model.py",
> line 128, in model_batch
> self.ui_batch = theano.function([ui, yi], cost1, updates=updates2)
> File
> "/home/shashank/cpuenv/local/lib/python2.7/site-packages/theano/compile/function.py",
>
> line 320, in function
> output_keys=output_keys)
> File
> "/home/shashank/cpuenv/local/lib/python2.7/site-packages/theano/compile/pfunc.py",
>
> line 479, in pfunc
> output_keys=output_keys)
> File
> "/home/shashank/cpuenv/local/lib/python2.7/site-packages/theano/compile/function_module.py",
>
> line 1776, in orig_function
> output_keys=output_keys).create(
> File
> "/home/shashank/cpuenv/local/lib/python2.7/site-packages/theano/compile/function_module.py",
>
> line 1428, in __init__
> accept_inplace)
> File
> "/home/shashank/cpuenv/local/lib/python2.7/site-packages/theano/compile/function_module.py",
>
> line 177, in std_fgraph
> update_mapping=update_mapping)
> File
> "/home/shashank/cpuenv/local/lib/python2.7/site-packages/theano/gof/fg.py",
> line 171, in __init__
> self.__import_r__(output, reason="init")
> File
> "/home/shashank/cpuenv/local/lib/python2.7/site-packages/theano/gof/fg.py",
> line 360, in __import_r__
> self.__import__(variable.owner, reason=reason)
> File
> "/home/shashank/cpuenv/local/lib/python2.7/site-packages/theano/gof/fg.py",
> line 474, in __import__
> r)
> theano.gof.fg.MissingInputError: ("An input of the graph, used to compute
> Subtensor{::, int64}(<TensorType(int32, matrix)>, Constant{1}), was not
> provided and not given a value.Use the Theano flag
> exception_verbosity='high',for more information on this error.",
> <TensorType(int32, matrix)>)
>
>
> I have checked the model several times and I think I am passing the inputs
> in the theano functions, so I am not sure where this error is coming from.
> Any leads on this will be appreciated.
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "theano-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
--
Pascal
--
---
You received this message because you are subscribed to the Google Groups
"theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.