def _residual_stack(self, inputs, config, name): self._default_dict['activation'] = self._get_activation( config.activation) self._default_dict['name'] = f"{name}_residual_down" if self._dilate: self._default_dict['dilation_rate'] = config.dilation_rate if config.repetitions < 8: config.repetitions += 2 else: self._default_dict['dilation_rate'] = 1 x = nn_blocks.DarkResidual(filters=config.filters, downsample=True, **self._default_dict)(inputs) dilated_reps = config.repetitions - self._default_dict[ 'dilation_rate'] // 2 - 1 for i in range(dilated_reps): self._default_dict['name'] = f"{name}_{i}" x = nn_blocks.DarkResidual(filters=config.filters, **self._default_dict)(x) for i in range(dilated_reps, config.repetitions - 1): self._default_dict[ 'dilation_rate'] = self._default_dict['dilation_rate'] // 2 self._default_dict[ 'name'] = f"{name}_{i}_degrided_{self._default_dict['dilation_rate']}" x = nn_blocks.DarkResidual(filters=config.filters, **self._default_dict)(x) self._default_dict['activation'] = self._activation self._default_dict['name'] = None self._default_dict['dilation_rate'] = 1 return x
def _residual_stack(self, inputs, config, name): self._default_dict['activation'] = self._get_activation(config.activation) self._default_dict['name'] = f"{name}_residual_down" x = nn_blocks.DarkResidual( filters=config.filters, downsample=True, **self._default_dict)( inputs) for i in range(config.repetitions - 1): self._default_dict['name'] = f"{name}_{i}" x = nn_blocks.DarkResidual( filters=config.filters, **self._default_dict)( x) self._default_dict['activation'] = self._activation self._default_dict['name'] = None return x
def _csp_stack(self, inputs, config, name): if config.bottleneck: csp_filter_scale = 1 residual_filter_scale = 2 scale_filters = 1 else: csp_filter_scale = 2 residual_filter_scale = 1 scale_filters = 2 self._default_dict['activation'] = self._get_activation( config.activation) self._default_dict['name'] = f"{name}_csp_down" if self._dilate: self._default_dict['dilation_rate'] = config.dilation_rate #config.repetitions += 1 else: self._default_dict['dilation_rate'] = 1 #config.repetitions += 1 # swap/add dialation x, x_route = nn_blocks.CSPRoute(filters=config.filters, filter_scale=csp_filter_scale, downsample=True, **self._default_dict)(inputs) #print(config.repetitions - self._default_dict["dilation_rate"]//2) dilated_reps = config.repetitions - self._default_dict[ 'dilation_rate'] // 2 for i in range(dilated_reps): self._default_dict['name'] = f"{name}_{i}" x = nn_blocks.DarkResidual(filters=config.filters // scale_filters, filter_scale=residual_filter_scale, **self._default_dict)(x) for i in range(dilated_reps, config.repetitions): self._default_dict[ 'dilation_rate'] = self._default_dict['dilation_rate'] // 2 self._default_dict[ 'name'] = f"{name}_{i}_degrided_{self._default_dict['dilation_rate']}" x = nn_blocks.DarkResidual(filters=config.filters // scale_filters, filter_scale=residual_filter_scale, **self._default_dict)(x) self._default_dict['name'] = f"{name}_csp_connect" output = nn_blocks.CSPConnect(filters=config.filters, filter_scale=csp_filter_scale, **self._default_dict)([x, x_route]) self._default_dict['activation'] = self._activation self._default_dict['name'] = None return output
def test_gradient_pass_though(self, filters, width, height, downsample): loss = ks.losses.MeanSquaredError() optimizer = ks.optimizers.SGD() test_layer = nn_blocks.DarkResidual(filters, downsample=downsample) if downsample: mod = 2 else: mod = 1 init = tf.random_normal_initializer() x = tf.Variable( initial_value=init(shape=(1, width, height, filters), dtype=tf.float32)) y = tf.Variable( initial_value=init( shape=(1, int(np.ceil(width / mod)), int(np.ceil(height / mod)), filters), dtype=tf.float32)) with tf.GradientTape() as tape: x_hat = test_layer(x) grad_loss = loss(x_hat, y) grad = tape.gradient(grad_loss, test_layer.trainable_variables) optimizer.apply_gradients(zip(grad, test_layer.trainable_variables)) self.assertNotIn(None, grad)
def _csp_stack(self, inputs, config, name): if config.bottleneck: csp_filter_scale = 1 residual_filter_scale = 2 scale_filters = 1 else: csp_filter_scale = 2 residual_filter_scale = 1 scale_filters = 2 self._default_dict['activation'] = self._get_activation(config.activation) self._default_dict['name'] = f"{name}_csp_down" x, x_route = nn_blocks.CSPRoute( filters=config.filters, filter_scale=csp_filter_scale, downsample=True, **self._default_dict)( inputs) for i in range(config.repetitions): self._default_dict['name'] = f"{name}_{i}" x = nn_blocks.DarkResidual( filters=config.filters // scale_filters, filter_scale=residual_filter_scale, **self._default_dict)( x) self._default_dict['name'] = f"{name}_csp_connect" output = nn_blocks.CSPConnect( filters=config.filters, filter_scale=csp_filter_scale, **self._default_dict)([x, x_route]) self._default_dict['activation'] = self._activation self._default_dict['name'] = None return output
def test_pass_through(self, width, height, filters, downsample): mod = 1 if downsample: mod = 2 x = ks.Input(shape=(width, height, filters)) test_layer = nn_blocks.DarkResidual(filters=filters, downsample=downsample) outx = test_layer(x) print(outx) print(outx.shape.as_list()) self.assertAllEqual( outx.shape.as_list(), [None, np.ceil(width / mod), np.ceil(height / mod), filters])
def build_layer(self, layer_type, filters, filter_scale, count, stack_type, downsample): if stack_type is not None: layers = [] if layer_type == "residual": for _ in range(count): layers.append( nn_blocks.DarkResidual( filters=filters // filter_scale, filter_scale=filter_scale)) else: for _ in range(count): layers.append(nn_blocks.ConvBN(filters=filters)) if stack_type == "model": layers = tf.keras.Sequential(layers=layers) else: layers = None stack = nn_blocks.CSPStack( filters=filters, filter_scale=filter_scale, downsample=downsample, model_to_wrap=layers) return stack