def __init__(self, inmod, outmod, permutation, blocksize, *args, **kwargs): Connection.__init__(self, inmod, outmod, *args, **kwargs) if self.indim != self.outdim: raise ValueError("Indim (%i) does not equal outdim (%i)" % (self.indim, self.outdim)) if len(permutation) * blocksize != self.indim: raise ValueError( "Permutation has wrong size: should be %i but is %i." % ((self.indim / blocksize), len(permutation))) self.permutation = array(permutation) self.invpermutation = permute(range(len(permutation)), permutation) self.blocksize = blocksize
def __init__(self, inmod, outmod, permutation, blocksize, *args, **kwargs): Connection.__init__(self, inmod, outmod, *args, **kwargs) if self.indim != self.outdim: raise ValueError("Indim (%i) does not equal outdim (%i)" % ( self.indim, self.outdim)) if len(permutation) * blocksize != self.indim: raise ValueError( "Permutation has wrong size: should be %i but is %i." %( (self.indim / blocksize), len(permutation))) self.permutation = array(permutation) self.invpermutation = permute(list(range(len(permutation))), permutation) self.blocksize = blocksize
def _buildTopology(self): inlayer = self.inlayerclass(self.indim) outlayer = self.outlayerclass(self.sequenceLength * self.outsize) self.hiddenlayers = [] # Add connections and layers self.addInputModule(inlayer) for p in self._permsForSwiping(): i = self._makeMdrnnLayer() self.hiddenlayers.append(i) # Make a connection that permutes the input... in_pc = PermutationConnection(inlayer, i, p, self.blocksize) # .. and one that permutes it back. pinv = permute(list(range(len(p))), p) out_pc = PermutationConnection(i, outlayer, pinv, self.outsize) self.addModule(i) self.addConnection(in_pc) self.addConnection(out_pc) self.addOutputModule(outlayer)
def _backwardImplementation(self, outerr, inerr, inbuf): outerr = outerr.reshape(self.indim / self.blocksize, self.blocksize) outerr = permute(outerr, self.invpermutation) outerr.shape = self.indim, inerr += outerr
def _forwardImplementation(self, inbuf, outbuf): inbuf = inbuf.reshape(self.indim / self.blocksize, self.blocksize) inbuf = permute(inbuf, self.permutation) inbuf.shape = self.indim, outbuf += inbuf