def __init__(self, layers, cost, updater='Adam', verbose=2, Y=T.matrix(), iterator='SortedPadded'): self.settings = locals() del self.settings['self'] self.layers = layers if isinstance(cost, basestring): self.cost = case_insensitive_import(costs, cost) else: self.cost = cost if isinstance(updater, basestring): self.updater = case_insensitive_import(updates, updater)() else: self.updater = updater if isinstance(iterator, basestring): self.iterator = case_insensitive_import(iterators, iterator)() else: self.iterator = iterator # True if output is a padded sequence # Padded elements should not contribute to the loss # and should be removed before returning predictions. self.is_padseq_output = self.cost.__name__ in ['CategoricalPaddedSequenceCrossEntropy'] self.verbose = verbose for i in range(1, len(self.layers)): self.layers[i].connect(self.layers[i-1]) self.params = flatten([l.params for l in layers]) self.X = self.layers[0].input self.y_tr = self.layers[-1].output(dropout_active=True) self.y_te = self.layers[-1].output(dropout_active=False) self.Y = Y if self.is_padseq_output: # P codes whether a sequence element was created by padding # so that it can be ignored in the loss computation. # 0 for padded elements, 1 for not-padded elements self.P = T.matrix() cost = self.cost(self.Y, self.y_tr, self.P) else: cost = self.cost(self.Y, self.y_tr) self.updates = self.updater.get_updates(self.params, cost) if self.is_padseq_output: self._train = theano.function([self.X, self.Y, self.P], cost, updates=self.updates) self._cost = theano.function([self.X, self.Y, self.P], cost) else: self._train = theano.function([self.X, self.Y], cost, updates=self.updates) self._cost = theano.function([self.X, self.Y], cost) self._predict = theano.function([self.X], self.y_te)
def __init__(self, layers, cost, updater='Adam', verbose=2, Y=T.matrix(), iterator='SortedPadded'): self.settings = locals() del self.settings['self'] self.layers = layers if isinstance(cost, basestring): self.cost = case_insensitive_import(costs, cost) else: self.cost = cost if isinstance(updater, basestring): self.updater = case_insensitive_import(updates, updater)() else: self.updater = updater if isinstance(iterator, basestring): self.iterator = getattr(iterators, iterator)() else: self.iterator = iterator self.verbose = verbose for i in range(1, len(self.layers)): self.layers[i].connect(self.layers[i - 1]) self.params = flatten([l.params for l in layers]) self.X = self.layers[0].input self.y_tr = self.layers[-1].output(dropout_active=True) self.y_te = self.layers[-1].output(dropout_active=False) self.Y = Y cost = self.cost(self.Y, self.y_tr) self.updates = self.updater.get_updates(self.params, cost) self._train = theano.function([self.X, self.Y], cost, updates=self.updates) self._params = theano.function([], self.params[0]) self._cost = theano.function([self.X, self.Y], cost) self._predict = theano.function([self.X], self.y_te)
def __init__(self, layers, cost, updater='Adam', verbose=2, Y=T.matrix(), iterator='SortedPadded'): self.settings = locals() del self.settings['self'] self.layers = layers if isinstance(cost, basestring): self.cost = case_insensitive_import(costs, cost) else: self.cost = cost if isinstance(updater, basestring): self.updater = case_insensitive_import(updates, updater)() else: self.updater = updater if isinstance(iterator, basestring): self.iterator = case_insensitive_import(iterators, iterator)() else: self.iterator = iterator self.verbose = verbose for i in range(1, len(self.layers)): self.layers[i].connect(self.layers[i-1]) self.params = flatten([l.params for l in layers]) self.X = self.layers[0].input self.y_tr = self.layers[-1].output(dropout_active=True) self.y_te = self.layers[-1].output(dropout_active=False) self.Y = Y cost = self.cost(self.Y, self.y_tr) self.updates = self.updater.get_updates(self.params, cost) self._train = theano.function([self.X, self.Y], cost, updates=self.updates) self._cost = theano.function([self.X, self.Y], cost) self._predict = theano.function([self.X], self.y_te)