Esempio n. 1
0
    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}_degridded_{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
Esempio n. 2
0
  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
      degrid = int(tf.math.log(float(config.dilation_rate)) / tf.math.log(2.))
    else:
      self._default_dict['dilation_rate'] = 1
      degrid = 0

    # swap/add dialation
    x, x_route = nn_blocks.CSPRoute(
        filters=config.filters,
        filter_scale=csp_filter_scale,
        downsample=True,
        **self._default_dict)(
            inputs)

    dilated_reps = config.repetitions - degrid
    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'] = max(
          1, self._default_dict['dilation_rate'] // 2)
      self._default_dict[
          'name'] = f"{name}_{i}_degridded_{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
Esempio n. 3
0
 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
Esempio n. 4
0
    def test_gradient_pass_though(self, filters, width, height, downsample):
        loss = tf.keras.losses.MeanSquaredError()
        optimizer = tf.keras.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)
Esempio n. 5
0
    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
Esempio n. 6
0
 def test_pass_through(self, width, height, filters, downsample):
   mod = 1
   if downsample:
     mod = 2
   x = tf.keras.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])
Esempio n. 7
0
    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