Hello everyone,

I am trying to implement the multi-frame loss in this paper (equation (4) , 
Figure 1) applied to 3D meshes using Theano and Lasagne:
https://arxiv.org/pdf/1607.03597.pdf

I am using a custom convolutional layer that operates on meshes and needs a 
sparse matrix per training sample.
Basically, in order to learn a physics simulation,  I want to calculate the 
velocity loss for a single frame n and then step in the future 5 times, get 
that future loss and accumulate its partial derivatives to the gradient of 
the single frame.
The stepping in the future is the problematic part. I am trying with a scan 
at each loop to pass as input the result of the previous iteration (a 
vector with 3 channels X,Y,Z) and a sparse matrix. 
With the following (simplified) code I get this:

*NotImplementedError: Theano has no sparse vectorUse X[a:b, c:d], X[a:b, 
c:c+1] or X[a:b] instead.*


So essentially I don't know how to create a scan loop in which at each 
iteration inp.input_var (network input) is updated with the output of the 
network at the previous step. It seems in fact that inp.input_var can be 
passed only from a theano.function ??

Apart from the error my other questions are:
1- is this the correct way to do backpropagation through time ? (I want the 
loss to be a composition of losses like in RNNs, but from the future)
my doubt is especially how I have to use inp.input_var
2- should I use deterministic = true when I do the prediction in the future 
?

Any suggestions would be greatly appreciated !
Please ask me anything that is not clear.


import numpy as np

import theano
import theano.tensor as T
import theano.sparse as Tsp

import lasagne as L
import lasagne.layers as LL
import lasagne.objectives as LO

import re


# Built a deep network with custom convolutional layers for meshes
def get_model(inp, patch_op):
    icnn = inp
    # Geodesic convolutional layer
    icnn = (utils_lasagne.GCNNLayer([icnn, patch_op], 32, nrings=5, nrays=16
))
    icnn = (utils_lasagne.GCNNLayer([icnn, patch_op], 64, nrings=5, nrays=16
))
    icnn = (utils_lasagne.GCNNLayer([icnn, patch_op], 128, nrings=5, nrays=
16))

    ffn  = utils_lasagne.GCNNLayer([icnn, patch_op], 3, nrings=5, nrays=16, 
nonlinearity=None)

    return ffn


inp = LL.InputLayer(shape=(None, 3 ))
# patches (disks)
patch_op = LL.InputLayer(input_var=Tsp.csc_fmatrix('patch_op'), shape=(None, 
None))

ffn = get_model(inp, patch_op)

# ground truth velocities
truth = T.matrix('Truth')

disk1 = Tsp.csc_fmatrix('disk1')
disk2 = Tsp.csc_fmatrix('disk2')
disk3 = Tsp.csc_fmatrix('disk3')
disk4 = Tsp.csc_fmatrix('disk4')
disk5 = Tsp.csc_fmatrix('disk5')

targetFutureVelocitiesTruth = T.matrix('targetFutureVelocitiesTruth')

learn_rate = T.scalar('learning_rate') 

output = LL.get_output(ffn)    
pred   = LL.get_output(ffn, deterministic=True)  

# Skip Connection
inputVelocities = inp.input_var[:,:3]    # slice x y z excluding the 
constraint last dimension of zeros and ones
output += inputVelocities

targetVelocities  = truth[:,3:6]
velCost = squared_error(output, targetVelocities)

regL2 = L.regularization.regularize_network_params(ffn, L.regularization.l2)

# the cost of a single frame
cost = lambda_vel*velCost + l2_weight*regL2

# one step of the network
step = theano.function([patch_op.input_var, inp.input_var],    
                    [output],
                    on_unused_input='warn'
                    )

# lists of sparse matrices
disks = [disk1,disk2,disk3,disk4,disk5]
# step 5 frames in the future
futurePredictions, _ = theano.scan(step,
                        outputs_info = inp.input_var,
                        sequences = disks, 
                        n_steps = 5 )

# future velocity
lastFuturePrediction = futurePredictions[-1]
# error in the future
futureCost = squared_error(lastFuturePrediction, targetFutureVelocitiesTruth
)

# get network parameters
params = LL.get_all_params(ffn, trainable=True)
# accumulate partial derivatives from this frame and from future frame
grads = T.grad(cost, params)
gradsFuture = T.grad(futureCost, params)
grads = grads + gradsFuture

updates = L.updates.adam(grads, params, learning_rate=learn_rate)

funcs = dict()
funcs['train'] = theano.function([inp.input_var, patch_op.input_var, truth, 
learn_rate, 
                                targetFutureVelocitiesTruth, disk1, disk2, 
disk3, disk4, disk5 ],
                                  [cost],
                                  updates=updates,
                                  on_unused_input='warn')

# now just call the train function with a velocity field, disks, truth etc 
to have the global loss in one go








Thank you very much for your help
Fab

-- 

--- 
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.

Reply via email to