Example #1
0
    def __init__(self, indim, outdim, peepholes=False, name=None):
        nrNeurons = outdim
        self.peep = peepholes
        # internal buffers:
        self.ingate = zeros((0, nrNeurons))
        self.outgate = zeros((0, nrNeurons))
        self.forgetgate = zeros((0, nrNeurons))
        self.cell = zeros((0, nrNeurons))
        self.ingatex = zeros((0, nrNeurons))
        self.outgatex = zeros((0, nrNeurons))
        self.forgetgatex = zeros((0, nrNeurons))
        self.cellx = zeros((0, nrNeurons))
        self.state = zeros((0, nrNeurons))
        self.ingateError = zeros((0, nrNeurons))
        self.outgateError = zeros((0, nrNeurons))
        self.forgetgateError = zeros((0, nrNeurons))
        self.stateError = zeros((0, nrNeurons))
        self.Sin = zeros((0, indim * nrNeurons))
        self.Sforget = zeros((0, indim * nrNeurons))
        self.Scell = zeros((0, indim * nrNeurons))
        self.SinRec = zeros((0, nrNeurons * nrNeurons))
        self.SforgetRec = zeros((0, nrNeurons * nrNeurons))
        self.ScellRec = zeros((0, nrNeurons * nrNeurons))

        Module.__init__(self, indim, outdim, name)
        if self.peep:
            ParameterContainer.__init__(
                self, nrNeurons * 3 + (4 * indim + nrNeurons) * nrNeurons)
            self.Sin_peep = zeros((0, nrNeurons))
            self.Sforget_peep = zeros((0, nrNeurons))
            self.Scell_peep = zeros((0, nrNeurons))
        else:
            ParameterContainer.__init__(self,
                                        (4 * indim + nrNeurons) * nrNeurons)
        self._setParameters(self.params)
        self._setDerivatives(self.derivs)

        # transfer functions and their derivatives
        self.f = sigmoid
        self.fprime = sigmoidPrime
        self.g = lambda x: 2 * tanh(x)
        self.gprime = lambda x: 2 * tanhPrime(x)
        self.h = self.g
        self.hprime = self.gprime
Example #2
0
 def __init__(self, indim, outdim, peepholes = False, name = None):
     nrNeurons = outdim
     self.peep = peepholes
     # internal buffers:
     self.ingate = zeros((0,nrNeurons))
     self.outgate = zeros((0,nrNeurons))
     self.forgetgate = zeros((0,nrNeurons))
     self.cell = zeros((0,nrNeurons))
     self.ingatex = zeros((0,nrNeurons))
     self.outgatex = zeros((0,nrNeurons))
     self.forgetgatex = zeros((0,nrNeurons))
     self.cellx = zeros((0,nrNeurons))
     self.state = zeros((0,nrNeurons))
     self.ingateError = zeros((0,nrNeurons))
     self.outgateError = zeros((0,nrNeurons))
     self.forgetgateError = zeros((0,nrNeurons))
     self.stateError = zeros((0,nrNeurons))
     self.Sin = zeros((0,indim*nrNeurons))
     self.Sforget = zeros((0,indim*nrNeurons))
     self.Scell = zeros((0,indim*nrNeurons))
     self.SinRec = zeros((0,nrNeurons*nrNeurons))
     self.SforgetRec = zeros((0,nrNeurons*nrNeurons))
     self.ScellRec = zeros((0,nrNeurons*nrNeurons))
     
     Module.__init__(self, indim, outdim, name)
     if self.peep:
         ParameterContainer.__init__(self, nrNeurons*3 + (4*indim+nrNeurons)*nrNeurons)
         self.Sin_peep = zeros((0,nrNeurons))
         self.Sforget_peep = zeros((0,nrNeurons))
         self.Scell_peep = zeros((0,nrNeurons))
     else:
         ParameterContainer.__init__(self, (4*indim+nrNeurons)*nrNeurons)
     self._setParameters(self.params)
     self._setDerivatives(self.derivs)
         
     # transfer functions and their derivatives
     self.f = sigmoid
     self.fprime = sigmoidPrime
     self.g = lambda x: 2*tanh(x)
     self.gprime = lambda x: 2*tanhPrime(x)
     self.h = self.g
     self.hprime = self.gprime
Example #3
0
class LSTMLayer(NeuronLayer, ParameterContainer):
    """Long short-term memory cell layer.
    
    The input consists of 4 parts, in the following order:
    - input gate
    - forget gate
    - cell input
    - output gate
    
    """

    sequential = True
    peepholes = False
    maxoffset = 0

    # Transfer functions and their derivatives
    f = lambda _, x: sigmoid(x)
    fprime = lambda _, x: sigmoidPrime(x)
    g = lambda _, x: tanh(x)
    gprime = lambda _, x: tanhPrime(x)
    h = lambda _, x: tanh(x)
    hprime = lambda _, x: tanhPrime(x)

    def __init__(self, dim, peepholes=False, name=None):
        """ 
        :arg dim: number of cells
        :key peepholes: enable peephole connections (from state to gates)? """
        self.setArgs(dim=dim, peepholes=peepholes)

        # Internal buffers, created dynamically:
        self.bufferlist = [
            ('ingate', dim),
            ('outgate', dim),
            ('forgetgate', dim),
            ('ingatex', dim),
            ('outgatex', dim),
            ('forgetgatex', dim),
            ('state', dim),
            ('ingateError', dim),
            ('outgateError', dim),
            ('forgetgateError', dim),
            ('stateError', dim),
        ]

        Module.__init__(self, 4 * dim, dim, name)
        if self.peepholes:
            ParameterContainer.__init__(self, dim * 3)
            self._setParameters(self.params)
            self._setDerivatives(self.derivs)

    def _setParameters(self, p, owner=None):
        ParameterContainer._setParameters(self, p, owner)
        dim = self.outdim
        self.ingatePeepWeights = self.params[:dim]
        self.forgetgatePeepWeights = self.params[dim:dim * 2]
        self.outgatePeepWeights = self.params[dim * 2:]

    def _setDerivatives(self, d, owner=None):
        ParameterContainer._setDerivatives(self, d, owner)
        dim = self.outdim
        self.ingatePeepDerivs = self.derivs[:dim]
        self.forgetgatePeepDerivs = self.derivs[dim:dim * 2]
        self.outgatePeepDerivs = self.derivs[dim * 2:]

    def _isLastTimestep(self):
        """Tell wether the current offset is the maximum offset."""
        return self.maxoffset == self.offset

    def _forwardImplementation(self, inbuf, outbuf):
        self.maxoffset = max(self.offset + 1, self.maxoffset)

        dim = self.outdim
        # slicing the input buffer into the 4 parts
        try:
            self.ingatex[self.offset] = inbuf[:dim]
        except IndexError:
            raise str((self.offset, self.ingatex.shape))

        self.forgetgatex[self.offset] = inbuf[dim:dim * 2]
        cellx = inbuf[dim * 2:dim * 3]
        self.outgatex[self.offset] = inbuf[dim * 3:]

        # peephole treatment
        if self.peepholes and self.offset > 0:
            self.ingatex[self.offset] += self.ingatePeepWeights * self.state[
                self.offset - 1]
            self.forgetgatex[
                self.offset] += self.forgetgatePeepWeights * self.state[
                    self.offset - 1]

        self.ingate[self.offset] = self.f(self.ingatex[self.offset])
        self.forgetgate[self.offset] = self.f(self.forgetgatex[self.offset])

        self.state[self.offset] = self.ingate[self.offset] * self.g(cellx)
        if self.offset > 0:
            self.state[self.offset] += self.forgetgate[
                self.offset] * self.state[self.offset - 1]

        if self.peepholes:
            self.outgatex[self.offset] += self.outgatePeepWeights * self.state[
                self.offset]
        self.outgate[self.offset] = self.f(self.outgatex[self.offset])

        outbuf[:] = self.outgate[self.offset] * self.h(self.state[self.offset])

    def _backwardImplementation(self, outerr, inerr, outbuf, inbuf):
        dim = self.outdim
        cellx = inbuf[dim * 2:dim * 3]

        self.outgateError[self.offset] = self.fprime(
            self.outgatex[self.offset]) * outerr * self.h(
                self.state[self.offset])
        self.stateError[self.offset] = outerr * self.outgate[
            self.offset] * self.hprime(self.state[self.offset])
        if not self._isLastTimestep():
            self.stateError[self.offset] += self.stateError[
                self.offset + 1] * self.forgetgate[self.offset + 1]
            if self.peepholes:
                self.stateError[self.offset] += self.ingateError[
                    self.offset + 1] * self.ingatePeepWeights
                self.stateError[self.offset] += self.forgetgateError[
                    self.offset + 1] * self.forgetgatePeepWeights
        if self.peepholes:
            self.stateError[self.offset] += self.outgateError[
                self.offset] * self.outgatePeepWeights
        cellError = self.ingate[self.offset] * self.gprime(
            cellx) * self.stateError[self.offset]
        if self.offset > 0:
            self.forgetgateError[self.offset] = self.fprime(
                self.forgetgatex[self.offset]) * self.stateError[
                    self.offset] * self.state[self.offset - 1]

        self.ingateError[self.offset] = self.fprime(self.ingatex[
            self.offset]) * self.stateError[self.offset] * self.g(cellx)

        # compute derivatives
        if self.peepholes:
            self.outgatePeepDerivs += self.outgateError[
                self.offset] * self.state[self.offset]
            if self.offset > 0:
                self.ingatePeepDerivs += self.ingateError[
                    self.offset] * self.state[self.offset - 1]
                self.forgetgatePeepDerivs += self.forgetgateError[
                    self.offset] * self.state[self.offset - 1]

        inerr[:dim] = self.ingateError[self.offset]
        inerr[dim:dim * 2] = self.forgetgateError[self.offset]
        inerr[dim * 2:dim * 3] = cellError
        inerr[dim * 3:] = self.outgateError[self.offset]

    def whichNeuron(self, inputIndex=None, outputIndex=None):
        if inputIndex != None:
            return inputIndex % self.dim
        if outputIndex != None:
            return outputIndex
Example #4
0
 def hprime(self, x): return tanhPrime(x)
 
 def __init__(self, dim, dimensions=1, peepholes=False, name=None):
Example #5
0
 def gprime(self, x): return tanhPrime(x)
 def h(self, x): return tanh(x)
Example #6
0
 def hprime(self, x):
     return tanhPrime(x)
Example #7
0
    def hprime(self, x): return tanhPrime(x)

    def __init__(self, dim, dimensions=1, peepholes=False, name=None):
Example #8
0
 def gprime(self, x): return tanhPrime(x)
 def h(self, x): return tanh(x)
Example #9
0
 def hprime(self, x):
     return tanhPrime(x)