I'm attempting to write a differentiable, parameterized image rotation layer in Theano with decent performance - as result I'm doing some slightly unusual things in terms of indexing in order to get decent performance. When I try to optimize the resulting theano graph using fast_run I get a series of errors that don't appear when I use the straight python implementation:
ERROR (theano.gof.opt): SeqOptimizer apply <theano.scan_module.scan_opt.PushOutNonSeqScan object at 0x7f542b2db750> ERROR (theano.gof.opt): Traceback: ERROR (theano.gof.opt): Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/theano/gof/opt.py", line 230, in apply sub_prof = optimizer.optimize(fgraph) File "/usr/local/lib/python2.7/dist-packages/theano/gof/opt.py", line 89, in optimize ret = self.apply(fgraph, *args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/theano/scan_module/scan_opt.py", line 228, in apply self.process_node(fgraph, node) File "/usr/local/lib/python2.7/dist-packages/theano/scan_module/scan_opt.py", line 313, in process_node **dict(return_list=True))[0].owner File "/usr/local/lib/python2.7/dist-packages/theano/gof/op.py", line 611, in __call__ node = self.make_node(*inputs, **kwargs) File "/usr/local/lib/python2.7/dist-packages/theano/tensor/subtensor.py", line 2133, in make_node index = tuple(map(as_index_variable, index)) File "/usr/local/lib/python2.7/dist-packages/theano/tensor/subtensor.py", line 2079, in as_index_variable idx = theano.tensor.as_tensor_variable(idx) File "/usr/local/lib/python2.7/dist-packages/theano/tensor/basic.py", line 167, in as_tensor_variable "Variable type field must be a TensorType.", x, x.type) AsTensorError: ('Variable type field must be a TensorType.', NoneConst, <theano.tensor.type_other.NoneTypeT object at 0x7f542dbcab10>) A snippet of relevant code: W=2 > coordsP = T.add(pts.astype('float32'),self.D.reshape((-1,2))) > contributors = getNeighborhood(coordsP,W) > diffs = contributors - coordsP.reshape((-1,1,2)) > kernVals = kern(diffs,W) > contributorsLin = contributorsToLinInd(contributors) > # Loop over neighborhood > result = T.zeros(input.shape) > for i in range((2*W)**2): > result = result + > (input.astype('float32')[:,contributorsLin[:,i].astype('int16')])*(kernVals[:,i].T) But basically there's a finite kernel that for each output pixel I want to evaluate the sum of the kernel's values times the input pixels values over the support of the kernel (neighborhood). For performance I'm trying to explicitly write the loop over the input pixels in the support of the kernel (rather than using a dynamically built sparse matrix). My concern is that this is somewhat "weird" and I might be hitting an edge case in the Theano optimization pipeline. I should add that my goal is for this function to be thrice differentiable in self.D - analytically this is the case, as my kernel has a triple zero at the bounds of its support, but I need to make sure not to NaN anything along the way. If anybody has any suggestions for debugging this I'd greatly appreciate it! Thanks, Michael -- --- 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 theano-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.