Esempio n. 1
0
    def __init__(self, name, inputs, tower_setup, n_convs=2, n_features=None, dilations=None, strides=None,
                 filter_size=None, activation="relu", batch_norm_decay=BATCH_NORM_DECAY_DEFAULT, l2=L2_DEFAULT):
        super(ResidualUnit2, self).__init__()
        # TODO: dropout
        curr, n_features_inp = prepare_input(inputs)
        res = curr
        assert n_convs >= 1, n_convs

        if dilations is not None:
            assert strides is None
        elif strides is None:
            strides = [[1, 1]] * n_convs
        if filter_size is None:
            filter_size = [[3, 3]] * n_convs
        if n_features is None:
            n_features = n_features_inp
        if not isinstance(n_features, list):
            n_features = [n_features] * n_convs

        with tf.variable_scope(name):
            curr = self.create_and_apply_batch_norm(curr, n_features_inp, batch_norm_decay, tower_setup, "bn0")
            curr = get_activation(activation)(curr)

            if strides is None:
                strides_res = [1, 1]
            else:
                strides_res = numpy.prod(strides, axis=0).tolist()
            if (n_features[-1] != n_features_inp) or (strides_res != [1, 1]):
                W0 = self.create_weight_variable("W0", [1, 1] + [n_features_inp, n_features[-1]], l2, tower_setup)
                if dilations is None:
                    res = conv2d(curr, W0, strides_res)
                else:
                    res = conv2d(curr, W0)

            W1 = self.create_weight_variable("W1", filter_size[0] + [n_features_inp, n_features[0]], l2, tower_setup)
            if dilations is None:
                curr = conv2d(curr, W1, strides[0])
            else:
                curr = conv2d_dilated(curr, W1, dilations[0])
            for idx in range(1, n_convs):
                curr = self.create_and_apply_batch_norm(curr, n_features[idx - 1], batch_norm_decay,
                                                        tower_setup, "bn" + str(idx + 1))
                curr = get_activation(activation)(curr)
                Wi = self.create_weight_variable("W" + str(idx + 1),
                                                 filter_size[idx] + [n_features[idx - 1], n_features[idx]],
                                                 l2, tower_setup)
                if dilations is None:
                    curr = conv2d(curr, Wi, strides[idx])
                else:
                    curr = conv2d_dilated(curr, Wi, dilations[idx])

        curr += res
        self.outputs = [curr]
Esempio n. 2
0
    def __init__(self, name, inputs, n_features, tower_setup, old_order=False, filter_size=(3, 3),
                 strides=(1, 1), dilation=None, pool_size=(1, 1), pool_strides=None, activation="relu", dropout=0.0,
                 batch_norm=False, bias=False, batch_norm_decay=BATCH_NORM_DECAY_DEFAULT, l2=L2_DEFAULT):
        super(Conv, self).__init__()
        # mind the order of dropout, conv, activation and batchnorm!
        # default: batchnorm -> activation -> dropout -> conv -> pool
        # if old_order: dropout -> conv -> batchnorm -> activation -> pool

        curr, n_features_inp = prepare_input(inputs)

        filter_size = list(filter_size)
        strides = list(strides)
        pool_size = list(pool_size)
        if pool_strides is None:
            pool_strides = pool_size

        with tf.variable_scope(name):
            W = self.create_weight_variable("W", filter_size + [n_features_inp, n_features], l2, tower_setup)
            b = None
            if bias:
                b = self.create_bias_variable("b", [n_features], tower_setup)

            if old_order:
                curr = apply_dropout(curr, dropout)
                if dilation is None:
                    curr = conv2d(curr, W, strides)
                else:
                    curr = conv2d_dilated(curr, W, dilation)
                if bias:
                    curr += b
                if batch_norm:
                    curr = self.create_and_apply_batch_norm(curr, n_features, batch_norm_decay, tower_setup)
                curr = get_activation(activation)(curr)
            else:
                if batch_norm:
                    curr = self.create_and_apply_batch_norm(curr, n_features_inp, batch_norm_decay, tower_setup)
                curr = get_activation(activation)(curr)
                curr = apply_dropout(curr, dropout)
                if dilation is None:
                    curr = conv2d(curr, W, strides)
                else:
                    curr = conv2d_dilated(curr, W, dilation)
                if bias:
                    curr += b

            if pool_size != [1, 1]:
                curr = max_pool(curr, pool_size, pool_strides)
        self.outputs = [curr]
Esempio n. 3
0
  def __init__(self, name, inputs, targets, n_classes, void_label, tower_setup, filter_size=(1, 1),
               input_activation=None, dilation=None, resize_targets=False, resize_logits=False, loss="ce",
               fraction=None, l2=L2_DEFAULT, dropout=0.0):
    super(SegmentationSoftmax, self).__init__()
    assert targets.get_shape().ndims == 4, targets.get_shape()
    assert not (resize_targets and resize_logits)
    inp, n_features_inp = prepare_input(inputs)

    filter_size = list(filter_size)

    with tf.variable_scope(name):
      if input_activation is not None:
        inp = get_activation(input_activation)(inp)

      inp = apply_dropout(inp, dropout)

      self.W, self.b, self.W_adjustable, self.b_adjustable, self.n_classes_current, W, b = self.create_weights(
        n_classes, filter_size, n_features_inp, l2, tower_setup)
      self.adjustable_output_assign_data = self._create_adjustable_output_assign_data(tower_setup)
      if self.n_classes_current is None:
        self.n_classes_current = n_classes

      if dilation is None:
        y_pred = conv2d(inp, W) + b
      else:
        y_pred = conv2d_dilated(inp, W, dilation) + b
      self.outputs = [tf.nn.softmax(y_pred, -1, 'softmax')]

      if resize_targets:
        targets = tf.image.resize_nearest_neighbor(targets, tf.shape(y_pred)[1:3])
      if resize_logits:
        y_pred = tf.image.resize_images(y_pred, tf.shape(targets)[1:3])

      pred = tf.argmax(y_pred, axis=3)
      targets = tf.cast(targets, tf.int64)
      targets = tf.squeeze(targets, axis=3)

      # TODO: Void label is not considered in the iou calculation.
      if void_label is not None:
        # avoid nan by replacing void label by 0
        # note: the loss for these cases is multiplied by 0 below
        void_label_mask = tf.equal(targets, void_label)
        no_void_label_mask = tf.logical_not(void_label_mask)
        targets = tf.where(void_label_mask, tf.zeros_like(targets), targets)
      else:
        no_void_label_mask = None

      self.measures = self.create_measures(n_classes, pred, targets)
      self.loss = self.create_loss(loss, fraction, no_void_label_mask, targets, tower_setup, void_label, y_pred)
      self.add_scalar_summary(self.loss, "loss")