from .layer import Layer import numpy as np class local_layer(Layer): def setup(self, ksize, c, n, stride, pad, w_, h_, activation): self.pad = pad * int(ksize / 2) self.activation = activation self.stride = stride self.ksize = ksize self.h_out = h_ self.w_out = w_ self.dnshape = [h_ * w_, n, c, ksize, ksize] self.wshape = dict({ 'biases': [h_ * w_ * n], 'kernels': [h_ * w_, ksize, ksize, c, n] }) def finalize(self, _): weights = self.w['kernels'] if weights is None: return weights = weights.reshape(self.dnshape) weights = weights.transpose([0,3,4,2,1]) self.w['kernels'] = weights class conv_extract_layer(Layer): def setup(self, ksize, c, n, stride, pad, batch_norm, activation, inp, out): if inp is None: inp = range(c) self.activation = activation self.batch_norm = batch_norm self.stride = stride self.ksize = ksize self.pad = pad self.inp = inp self.out = out self.wshape = dict({ 'biases': [len(out)], 'kernel': [ksize, ksize, len(inp), len(out)] }) @property def signature(self): sig = ['convolutional'] sig += self._signature[1:-2] return sig def present(self): args = self.signature self.presenter = convolutional_layer(*args) def recollect(self, w): if w is None: self.w = w return k = w['kernel'] b = w['biases'] k = np.take(k, self.inp, 2) k = np.take(k, self.out, 3) b = np.take(b, self.out) assert1 = k.shape == tuple(self.wshape['kernel']) assert2 = b.shape == tuple(self.wshape['biases']) assert assert1 and assert2, \ 'Dimension not matching in {} recollect'.format( self._signature) self.w['kernel'] = k self.w['biases'] = b class conv_select_layer(Layer): def setup(self, ksize, c, n, stride, pad, batch_norm, activation, keep_idx, real_n): self.batch_norm = bool(batch_norm) self.activation = activation self.keep_idx = keep_idx self.stride = stride self.ksize = ksize self.pad = pad self.wshape = dict({ 'biases': [real_n], 'kernel': [ksize, ksize, c, real_n] }) if self.batch_norm: self.wshape.update({ 'moving_variance' : [real_n], 'moving_mean': [real_n], 'gamma' : [real_n] }) self.h['is_training'] = { 'shape': (), 'feed': True, 'dfault': False } @property def signature(self): sig = ['convolutional'] sig += self._signature[1:-2] return sig def present(self): args = self.signature self.presenter = convolutional_layer(*args) def recollect(self, w): if w is None: self.w = w return idx = self.keep_idx k = w['kernel'] b = w['biases'] self.w['kernel'] = np.take(k, idx, 3) self.w['biases'] = np.take(b, idx) if self.batch_norm: m = w['moving_mean'] v = w['moving_variance'] g = w['gamma'] self.w['moving_mean'] = np.take(m, idx) self.w['moving_variance'] = np.take(v, idx) self.w['gamma'] = np.take(g, idx) class convolutional_layer(Layer): def setup(self, ksize, c, n, stride, pad, batch_norm, activation): self.batch_norm = bool(batch_norm) self.activation = activation self.stride = stride self.ksize = ksize self.pad = pad self.dnshape = [n, c, ksize, ksize] # darknet shape self.wshape = dict({ 'biases': [n], 'kernel': [ksize, ksize, c, n] }) if self.batch_norm: self.wshape.update({ 'moving_variance' : [n], 'moving_mean': [n], 'gamma' : [n] }) self.h['is_training'] = { 'feed': True, 'dfault': False, 'shape': () } def finalize(self, _): """deal with darknet""" kernel = self.w['kernel'] if kernel is None: return kernel = kernel.reshape(self.dnshape) kernel = kernel.transpose([2,3,1,0]) self.w['kernel'] = kernel