Hi all, I followed the example of creating new operations and types in Python and I am trying to create a Type that allows differentiation (building upon the very basic "Double" type from the documentation).
Links: - Creating a New Op: http://deeplearning.net/software/theano/extending/extending_theano.html - Making the Double Type: http://deeplearning.net/software/theano/extending/type.html >From there, I currently have the following code: import theano class Double(theano.gof.Type): def filter(self, value, strict = False, allow_downcast = None): if strict: # we need to return a type, but if the value is incompatible raise an exception if isinstance(value, float): return value else: raise TypeError('Expected a float!') elif allow_downcast: return float(value) else: value_float = float(value) if value_float == value: return value_float else: raise TypeError('The double type cannot be accurately represent %s of type %s' % (value, type(value))) def values_eq_approx(self, value_a, value_b, tolerance = 1e-6): return abs(value_a - value_b) / (abs(value_a) + abs(value_b)) < tolerance double = Double() class DoubleAddOp(theano.Op): __props__ = () def make_node(self, x, y): # check input types if isinstance(x, (int, float)): x = theano.gof.Constant(double, x) if isinstance(y, (int, float)): y = theano.gof.Constant(double, y) if x.type != double or y.type != double: raise TypeError('DoubleAddOp only works on doubles.') return theano.gof.Apply(self, [x, y], [double()]) def perform(self, node, inputs, output_storage): x = inputs[0] y = inputs[1] z = output_storage[0] z[0] = x + y def infer_shape(self, node, input_shapes): return [input_shapes[0]] def grad(self, inputs, output_grads): return [output_grads[0]*1, output_grads[0]*1] def __str__(self): return 'DoubleAddOp' dadd = DoubleAddOp() Overall, I would like to be able to do something like: x = double('x') y = double('y') z = dadd(x, y) print(z.type) gx = theano.tensor.grad(z, x) gy = theano.tensor.grad(z, y) f = theano.function([x, y], [gx, gy]) Are there any examples on defining new types allowing gradient computation or anyone willing to help? I also posted a related question on StackOverflow: http://stackoverflow.com/questions/41858327/how-to-define-custom-theano-types-allowing-differentiation Thanks! -- --- 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.
