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]
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")