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