示例#1
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]
示例#2
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")