Ejemplo n.º 1
0
    def __call__(self, *args, **kwargs):
        """
        Compose this layer with the inputs provided
        """
        if 'one_step' in kwargs and kwargs['one_step']:
            del kwargs['one_step']
            args = [self.tensor_from_layer(arg, False) for arg in args]
            kwargs = dict([(k, self.tensor_from_layer(v, False))
                           for k, v in kwargs.items()])
            if hasattr(self, 'step_fprop'):
                return self.step_fprop(*args, **kwargs)
            else:
                return self.fprop(*args, **kwargs)
        new_obj = utils.copy(self)

        args = [new_obj.tensor_from_layer(arg) for arg in args]
        kwargs = dict([(k, new_obj.tensor_from_layer(v))
                       for k, v in kwargs.items()])
        if 'do' in kwargs:
            kind = kwargs['do']
            del kwargs['do']
        else:
            kind = 'fprop'
        if 'one_step' in kwargs:
            del kwargs['one_step']
        new_obj.prev_args = (args, kwargs)
        if kind == 'fprop':
            new_obj.fprop(*args, **kwargs)
        elif kind == 'eval':
            new_obj.get_cost(*args, **kwargs)
        elif kind == 'train':
            new_obj.get_grads(*args, **kwargs)
        elif kind == 'run':
            return new_obj.run(*args, **kwargs)
        return new_obj
Ejemplo n.º 2
0
 def __abs__(self, other):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     new_obj.out = abs(new_obj.out)
     if hasattr(new_obj, 'grads'):
         new_obj.grads = [TT.sgn(new_obj.out) * x for x in new_obj.grads]
     return new_obj
Ejemplo n.º 3
0
 def __abs__(self, other):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     new_obj.out = abs(new_obj.out)
     if hasattr(new_obj, 'grads'):
         new_obj.grads = [TT.sgn(new_obj.out) * x for x in new_obj.grads]
     return new_obj
Ejemplo n.º 4
0
    def __div__(self, other):
        assert hasattr(self, 'out'), 'all layers need a default output'
        new_obj = utils.copy(self)
        other_var = new_obj.tensor_from_layer(other)
        if hasattr(new_obj, 'grads') and hasattr(other, 'grads'):
            new_obj.grads = [x * other_var for x in new_obj.grads]
            for param, grad_param in zip(other.params, other.grads):
                pos = new_obj.params.index(param)
                new_obj.grads[pos] -= new_obj.out * grad_param
            new_obj.grads = [x / (other_var**2) for x in new_obj.grads]
        elif hasattr(new_obj, 'grads') and \
                isinstance(other, theano.gof.Variable) and \
                other.ndim == 0:

            new_obj.grads = [x * other_var for x in new_obj.grads]
            other_grads = TT.grad(other,
                                  new_obj.params,
                                  disconnected_inputs='ignore')
            new_obj.grads = [(x - new_obj.cost * y) / (other_var**2)
                             for x, y in zip(new_obj.grads, other_grads)]
        elif hasattr(new_obj, 'grads'):
            raise ValueError('I do not know how to compute the gradients'
                             ' of the subtracted term' + str(other) + '. Call'
                             ' train on it if it is an output layer')
        new_obj.out = new_obj.out / other_var
        return new_obj
Ejemplo n.º 5
0
    def __call__(self, *args, **kwargs):
        """
        Compose this layer with the inputs provided
        """
        if 'one_step' in kwargs and kwargs['one_step']:
            del kwargs['one_step']
            args = [self.tensor_from_layer(arg, False) for arg in args]
            kwargs = dict([(k, self.tensor_from_layer(v, False))
                           for k,v in kwargs.items()])
            if hasattr(self, 'step_fprop'):
                return self.step_fprop(*args, **kwargs)
            else:
                return self.fprop(*args, **kwargs)
        new_obj = utils.copy(self)

        args = [new_obj.tensor_from_layer(arg) for arg in args]
        kwargs = dict([(k, new_obj.tensor_from_layer(v)) for k,v in kwargs.items()])
        if 'do' in kwargs:
            kind = kwargs['do']
            del kwargs['do']
        else:
            kind = 'fprop'
        if 'one_step' in kwargs:
            del kwargs['one_step']
        new_obj.prev_args = (args, kwargs)
        if kind == 'fprop':
            new_obj.fprop(*args, **kwargs)
        elif kind == 'eval':
            new_obj.get_cost(*args, **kwargs)
        elif kind == 'train':
            new_obj.get_grads(*args, **kwargs)
        elif kind == 'run':
            return new_obj.run(*args, **kwargs)
        return new_obj
Ejemplo n.º 6
0
    def __div__(self, other):
        assert hasattr(self, 'out'), 'all layers need a default output'
        new_obj = utils.copy(self)
        other_var = new_obj.tensor_from_layer(other)
        if hasattr(new_obj, 'grads') and hasattr(other, 'grads'):
            new_obj.grads = [ x * other_var for x in new_obj.grads]
            for param, grad_param in zip(other.params, other.grads):
                pos = new_obj.params.index(param)
                new_obj.grads[pos] -= new_obj.out * grad_param
            new_obj.grads = [ x / (other_var**2) for x in new_obj.grads]
        elif hasattr(new_obj, 'grads') and \
                isinstance(other, theano.gof.Variable) and \
                other.ndim == 0:

            new_obj.grads = [ x * other_var for x in new_obj.grads]
            other_grads = TT.grad(other, new_obj.params,
                                  disconnected_inputs='ignore')
            new_obj.grads = [(x - new_obj.cost * y)/ (other_var**2)
                             for x,y in zip(new_obj.grads,
                                                  other_grads)]
        elif hasattr(new_obj, 'grads'):
            raise ValueError('I do not know how to compute the gradients'
                             ' of the subtracted term' + str(other) + '. Call'
                             ' train on it if it is an output layer')
        new_obj.out = new_obj.out / other_var
        return new_obj
Ejemplo n.º 7
0
 def __pow__(self, power):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     power = self.tensor_from_layer(power)
     new_obj.out = new_obj.out**power
     if hasattr(new_obj, 'grads'):
         raise NotImplemented
     return new_obj
Ejemplo n.º 8
0
 def __ge__(self, other):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     other = self.tensor_from_layer(other)
     new_obj.out = new_obj.out.__ge__(other)
     if hasattr(new_obj, 'grads'):
         raise NotImplemented
     return new_obj
Ejemplo n.º 9
0
 def __getitem__(self, pos):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     pos = self.tensor_from_layer(pos)
     new_obj.out = new_obj.out.__getitem__(pos)
     if hasattr(new_obj, 'grads'):
         raise NotImplemented
     return new_obj
Ejemplo n.º 10
0
 def __getitem__(self, pos):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     pos = self.tensor_from_layer(pos)
     new_obj.out = new_obj.out.__getitem__(pos)
     if hasattr(new_obj, 'grads'):
         raise NotImplemented
     return new_obj
Ejemplo n.º 11
0
 def __ge__(self, other):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     other = self.tensor_from_layer(other)
     new_obj.out = new_obj.out.__ge__(other)
     if hasattr(new_obj, 'grads'):
         raise NotImplemented
     return new_obj
Ejemplo n.º 12
0
 def __pow__(self, power):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     power = self.tensor_from_layer(power)
     new_obj.out = new_obj.out**power
     if hasattr(new_obj, 'grads'):
         raise NotImplemented
     return new_obj
Ejemplo n.º 13
0
 def clone(**new_inputs):
     new_obj = utils.copy(self)
     # Reorder inputs
     assert len(new_obj.inputs) == len(new_inputs.items())
     pairs = [(x, new_inputs[x.name]) for x in inputs]
     new_obj.inputs = new_inputs.values()
     new_obj.out = theano.clone(new_obj.out, replace=pairs)
     if hasattr(new_obj, 'cost'):
         new_obj.cost = theano.clone(new_obj.cost, replace=pairs)
     if hasattr(new_obj, 'grads'):
         new_obj.grads = theano.clone(new_obj.grads, replace=pairs)
     if hasattr(new_obj, 'sample'):
         new_obj.sample = theano.clone(new_obj.sample, replace=pairs)
     return new_obj
Ejemplo n.º 14
0
 def clone(**new_inputs):
     new_obj = utils.copy(self)
     # Reorder inputs
     assert len(new_obj.inputs) == len(new_inputs.items())
     pairs=[(x, new_inputs[x.name]) for x in inputs]
     new_obj.inputs = new_inputs.values()
     new_obj.out = theano.clone(new_obj.out, replace=pairs)
     if hasattr(new_obj, 'cost'):
         new_obj.cost = theano.clone(new_obj.cost, replace=pairs)
     if hasattr(new_obj, 'grads'):
         new_obj.grads = theano.clone(new_obj.grads, replace=pairs)
     if hasattr(new_obj, 'sample'):
         new_obj.sample = theano.clone(new_obj.sample, replace=pairs)
     return new_obj
Ejemplo n.º 15
0
 def clone(self, **new_inputs):
     new_obj = utils.copy(self)
     # Reorder inputs
     assert len(new_obj.inputs) == len(new_inputs.items())
     # TODO: error with inputs arg here. corrected missing self argument, this method must not be used
     pairs = [(x, new_inputs[x.name]) for x in inputs]
     new_obj.inputs = new_inputs.values()
     new_obj.out = theano.clone(new_obj.out, replace=pairs)
     if hasattr(new_obj, 'cost'):
         new_obj.cost = theano.clone(new_obj.cost, replace=pairs)
     if hasattr(new_obj, 'grads'):
         new_obj.grads = theano.clone(new_obj.grads, replace=pairs)
     if hasattr(new_obj, 'sample'):
         new_obj.sample = theano.clone(new_obj.sample, replace=pairs)
     return new_obj
Ejemplo n.º 16
0
 def get_sample(self, **kwargs):
     """
     Get a sample from the curren model.
     ! Only works for output layers
     """
     if not hasattr(self, 'get_cost'):
         raise TypeError('Non-output layer does not support this method')
     new_obj = utils.copy(self)
     try:
         o_args, o_kwargs = new_obj.prev_args
     except:
         o_args, o_kwargs = ([], {})
     kwargs = dict([(k, new_obj.tensor_from_layer(v)) for k,v in kwargs.items()])
     for (k,v) in kwargs.items():
         o_kwargs[k] = v
     new_obj.prev_args = (o_args, o_kwargs)
     sample = new_obj.compute_sample(*o_args, **o_kwargs)
     return sample
Ejemplo n.º 17
0
 def train(self, **kwargs):
     """
     Compute the cost and gradients of the current layer with respect to
     its parameters.
     ! Only works for output layers
     """
     if not hasattr(self, 'get_grads'):
         raise TypeError('Non-output layer does not support this method')
     new_obj = utils.copy(self)
     try:
         o_args, o_kwargs = new_obj.prev_args
     except:
         o_args, o_kwargs = ([], {})
     kwargs = dict([(k, new_obj.tensor_from_layer(v)) for k,v in kwargs.items()])
     for (k,v) in kwargs.items():
         o_kwargs[k] = v
     new_obj.prev_args = (o_args, o_kwargs)
     new_obj.get_grads(*o_args, **o_kwargs)
     return new_obj
Ejemplo n.º 18
0
 def get_sample(self, **kwargs):
     """
     Get a sample from the curren model.
     ! Only works for output layers
     """
     if not hasattr(self, 'get_cost'):
         raise TypeError('Non-output layer does not support this method')
     new_obj = utils.copy(self)
     try:
         o_args, o_kwargs = new_obj.prev_args
     except:
         o_args, o_kwargs = ([], {})
     kwargs = dict([(k, new_obj.tensor_from_layer(v))
                    for k, v in kwargs.items()])
     for (k, v) in kwargs.items():
         o_kwargs[k] = v
     new_obj.prev_args = (o_args, o_kwargs)
     sample = new_obj.compute_sample(*o_args, **o_kwargs)
     return sample
Ejemplo n.º 19
0
    def validate(self, **kwargs):
        """
        Recompute the cost error (without the gradients)
        It only works for output layers !
        """
        if not hasattr(self, 'get_cost'):
            raise TypeError('Non-output layer does not support this method')
        new_obj = utils.copy(self)
        try:
            o_args, o_kwargs = new_obj.prev_args
        except:
            o_args, o_kwargs = ([], {})

        kwargs = dict([(k, new_obj.tensor_from_layer(v)) for k,v in kwargs.items()])
        for (k,v) in kwargs.items():
            o_kwargs[k] = v
        new_obj.prev_args = (o_args, o_kwargs)
        new_obj.get_cost(*o_args, **o_kwargs)
        return new_obj
Ejemplo n.º 20
0
    def validate(self, **kwargs):
        """
        Recompute the cost error (without the gradients)
        It only works for output layers !
        """
        if not hasattr(self, 'get_cost'):
            raise TypeError('Non-output layer does not support this method')
        new_obj = utils.copy(self)
        try:
            o_args, o_kwargs = new_obj.prev_args
        except:
            o_args, o_kwargs = ([], {})

        kwargs = dict([(k, new_obj.tensor_from_layer(v))
                       for k, v in kwargs.items()])
        for (k, v) in kwargs.items():
            o_kwargs[k] = v
        new_obj.prev_args = (o_args, o_kwargs)
        new_obj.get_cost(*o_args, **o_kwargs)
        return new_obj
Ejemplo n.º 21
0
 def train(self, **kwargs):
     """
     Compute the cost and gradients of the current layer with respect to
     its parameters.
     ! Only works for output layers
     """
     if not hasattr(self, 'get_grads'):
         raise TypeError('Non-output layer does not support this method')
     new_obj = utils.copy(self)
     try:
         o_args, o_kwargs = new_obj.prev_args
     except:
         o_args, o_kwargs = ([], {})
     kwargs = dict([(k, new_obj.tensor_from_layer(v))
                    for k, v in kwargs.items()])
     for (k, v) in kwargs.items():
         o_kwargs[k] = v
     new_obj.prev_args = (o_args, o_kwargs)
     new_obj.get_grads(*o_args, **o_kwargs)
     return new_obj
Ejemplo n.º 22
0
 def __add__(self, other):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     other_var = new_obj.tensor_from_layer(other)
     new_obj.out = new_obj.out + other_var
     # Summing cost layers:
     if hasattr(new_obj, 'grads') and hasattr(other, 'grads'):
         for param, grad_param in zip(other.params, other.grads):
             pos = new_obj.params.index(param)
             new_obj.grads[pos] += grad_param
     elif hasattr(new_obj, 'grads') and \
             isinstance(other, theano.gof.Variable) and \
             other.ndim == 0:
         other_grads = TT.grad(other,
                               new_obj.params,
                               disconnected_inputs='warn')
         new_obj.grads = [x + y for x, y in zip(new_obj.grads, other_grads)]
     elif hasattr(new_obj, 'grads'):
         raise ValueError('I do not know how to compute the gradients'
                          ' of the added term' + str(other) + '. Call'
                          ' train on it if it is an output layer')
     return new_obj
Ejemplo n.º 23
0
 def __add__(self, other):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     other_var = new_obj.tensor_from_layer(other)
     new_obj.out = new_obj.out + other_var
     # Summing cost layers:
     if hasattr(new_obj, 'grads') and hasattr(other, 'grads'):
         for param, grad_param in zip(other.params, other.grads):
             pos = new_obj.params.index(param)
             new_obj.grads[pos] += grad_param
     elif hasattr(new_obj, 'grads') and \
             isinstance(other, theano.gof.Variable) and \
             other.ndim == 0:
         other_grads = TT.grad(other, new_obj.params,
                               disconnected_inputs='ignore')
         new_obj.grads = [x + y for x,y in zip(new_obj.grads,
                                               other_grads)]
     elif hasattr(new_obj, 'grads'):
         raise ValueError('I do not know how to compute the gradients'
                          ' of the added term' + str(other) + '. Call'
                          ' train on it if it is an output layer')
     return new_obj
Ejemplo n.º 24
0
 def reshape(self, shape):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     new_obj.out = new_obj.out.reshape(shape)
     return new_obj
Ejemplo n.º 25
0
 def reshape(self, shape):
     assert hasattr(self, 'out'), 'all layers need a default output'
     new_obj = utils.copy(self)
     new_obj.out = new_obj.out.reshape(shape)
     return new_obj