コード例 #1
0
  def testAtrousSequence(self):
    """Tests optimization of sequence of atrous convolutions.

    Verifies that a sequence of `atrous_conv2d` operations with identical `rate`
    parameters, 'SAME' `padding`, and `filters` with odd heights/ widths:

        net = atrous_conv2d(net, filters1, rate, padding="SAME")
        net = atrous_conv2d(net, filters2, rate, padding="SAME")
        ...
        net = atrous_conv2d(net, filtersK, rate, padding="SAME")

    is equivalent to:

        pad = ...  # padding so that the input dims are multiples of rate
        net = space_to_batch(net, paddings=pad, block_size=rate)
        net = conv2d(net, filters1, strides=[1, 1, 1, 1], padding="SAME")
        net = conv2d(net, filters2, strides=[1, 1, 1, 1], padding="SAME")
        ...
        net = conv2d(net, filtersK, strides=[1, 1, 1, 1], padding="SAME")
        net = batch_to_space(net, crops=pad, block_size=rate)
    """
    padding = "SAME"  # The padding needs to be "SAME"
    np.random.seed(1)  # Make it reproducible.

    with self.session(use_gpu=True):
      # Input: [batch, height, width, input_depth]
      for height in range(15, 17):
        for width in range(15, 17):
          x_shape = [3, height, width, 2]
          x = np.random.random_sample(x_shape).astype(np.float32)

          for kernel in [1, 3, 5]:  # The kernel size needs to be odd.
            # Filter: [kernel_height, kernel_width, input_depth, output_depth]
            f_shape = [kernel, kernel, 2, 2]
            f = 1e-2 * np.random.random_sample(f_shape).astype(np.float32)

            for rate in range(2, 4):
              # y1: three atrous_conv2d in a row.
              y1 = nn_ops.atrous_conv2d(x, f, rate, padding=padding)
              y1 = nn_ops.atrous_conv2d(y1, f, rate, padding=padding)
              y1 = nn_ops.atrous_conv2d(y1, f, rate, padding=padding)
              # y2: space_to_batch, three conv2d in a row, batch_to_space
              pad_bottom = 0 if height % rate == 0 else rate - height % rate
              pad_right = 0 if width % rate == 0 else rate - width % rate
              pad = [[0, pad_bottom], [0, pad_right]]
              y2 = array_ops.space_to_batch(x, paddings=pad, block_size=rate)
              y2 = nn_ops.conv2d(y2, f, strides=[1, 1, 1, 1], padding=padding)
              y2 = nn_ops.conv2d(y2, f, strides=[1, 1, 1, 1], padding=padding)
              y2 = nn_ops.conv2d(y2, f, strides=[1, 1, 1, 1], padding=padding)
              y2 = array_ops.batch_to_space(y2, crops=pad, block_size=rate)
              self.assertAllClose(
                  y1.eval(), self.evaluate(y2), rtol=1e-2, atol=1e-2)
コード例 #2
0
    def testAtrousConv2DForward(self):
        with self.session():
            # Input: [batch, height, width, input_depth]
            height = 9
            for width in [9, 10]:  # Test both odd and even width.
                x_shape = [2, height, width, 2]
                x = np.arange(np.prod(x_shape),
                              dtype=np.float32).reshape(x_shape)

                # Filter: [kernel_height, kernel_width, input_depth, output_depth]
                for kernel_height in range(1, 4):
                    for kernel_width in range(1, 4):
                        f_shape = [kernel_height, kernel_width, 2, 2]
                        f = np.arange(np.prod(f_shape),
                                      dtype=np.float32).reshape(f_shape)

                        for rate in range(1, 4):
                            f_up = _upsample_filters(f, rate)

                            for padding in ["SAME", "VALID"]:
                                y1 = nn_ops.atrous_conv2d(x,
                                                          f,
                                                          rate,
                                                          padding=padding)
                                y2 = nn_ops.conv2d(x,
                                                   f_up,
                                                   strides=[1, 1, 1, 1],
                                                   padding=padding)
                                self.assertAllClose(y1,
                                                    y2,
                                                    rtol=1e-3,
                                                    atol=1e-3)
コード例 #3
0
    def build_dilations(self, height, next_input, size, width, mask):
        inputs = [next_input]

        i = 0
        rates = [1, 1, 2, 2, 1, 4, 1, 2, 8, 1, 2, 1, 4, 2, 1, 2, 4, 1]
        for dilation_rate in rates:

            with tf.variable_scope("dilated_{}".format(i)):
                if dilation_rate <= 2:
                    height = 2
                else:
                    height = 1
                width = 3 + (i % 2)
                filter_ = tf.get_variable(
                    name="conv_filter_{}".format(i),
                    shape=[height, width, size, size],
                )
                res = atrous_conv2d(next_input,
                                    filters=filter_,
                                    rate=dilation_rate,
                                    padding="SAME")
                if i < -1:
                    res = tf.multiply(mask, res)
                inputs.append(res)
                next_input = ln(tf.nn.relu(sum(inputs)))
                tf.summary.histogram(name="activation", values=next_input)
                next_input = tf.nn.dropout(next_input, self.dropout_pl)
                i += 1
        return next_input
コード例 #4
0
    def testGradient(self):
        with self.session():
            # Input: [batch, height, width, input_depth]
            x_shape = [2, 5, 6, 2]
            # Filter: [kernel_height, kernel_width, input_depth, output_depth]
            f_shape = [3, 3, 2, 2]
            # Output: [batch, height, width, output_depth]
            y_shape = [2, 5, 6, 2]

            np.random.seed(1)  # Make it reproducible.
            x_val = np.random.random_sample(x_shape).astype(np.float32)
            f_val = np.random.random_sample(f_shape).astype(np.float32)
            x = constant_op.constant(x_val, name="x", dtype=dtypes.float32)
            f = constant_op.constant(f_val, name="f", dtype=dtypes.float32)

            for rate in range(1, 4):
                output = nn_ops.atrous_conv2d(x, f, rate=rate, padding="SAME")
                err = gradient_checker.compute_gradient_error(
                    [x, f], [x_shape, f_shape], output, y_shape)
                print("atrous_conv2d gradient err = %g " % err)
                err_tolerance = 4e-3 if test_util.is_xla_enabled() else 1e-3
                self.assertLess(err, err_tolerance)
コード例 #5
0
  def testAtrousConv2DForward(self):
    with self.session(use_gpu=True):
      # Input: [batch, height, width, input_depth]
      height = 9
      for width in [9, 10]:  # Test both odd and even width.
        x_shape = [2, height, width, 2]
        x = np.arange(np.prod(x_shape), dtype=np.float32).reshape(x_shape)

        # Filter: [kernel_height, kernel_width, input_depth, output_depth]
        for kernel_height in range(1, 4):
          for kernel_width in range(1, 4):
            f_shape = [kernel_height, kernel_width, 2, 2]
            f = np.arange(np.prod(f_shape), dtype=np.float32).reshape(f_shape)

            for rate in range(1, 4):
              f_up = _upsample_filters(f, rate)

              for padding in ["SAME", "VALID"]:
                y1 = nn_ops.atrous_conv2d(x, f, rate, padding=padding)
                y2 = nn_ops.conv2d(
                    x, f_up, strides=[1, 1, 1, 1], padding=padding)
                self.assertAllClose(
                    y1.eval(), self.evaluate(y2), rtol=1e-3, atol=1e-3)
コード例 #6
0
  def testGradient(self):
    with self.session(use_gpu=True):
      # Input: [batch, height, width, input_depth]
      x_shape = [2, 5, 6, 2]
      # Filter: [kernel_height, kernel_width, input_depth, output_depth]
      f_shape = [3, 3, 2, 2]
      # Output: [batch, height, width, output_depth]
      y_shape = [2, 5, 6, 2]

      np.random.seed(1)  # Make it reproducible.
      x_val = np.random.random_sample(x_shape).astype(np.float32)
      f_val = np.random.random_sample(f_shape).astype(np.float32)
      x = constant_op.constant(x_val, name="x", dtype=dtypes.float32)
      f = constant_op.constant(f_val, name="f", dtype=dtypes.float32)

      for rate in range(1, 4):
        output = nn_ops.atrous_conv2d(x, f, rate=rate, padding="SAME")
        err = gradient_checker.compute_gradient_error([x, f],
                                                      [x_shape, f_shape],
                                                      output, y_shape)
        print("atrous_conv2d gradient err = %g " % err)
        err_tolerance = 4e-3 if test_util.is_xla_enabled() else 1e-3
        self.assertLess(err, err_tolerance)