예제 #1
0
def sample_from_instances(inputs, outputs, num_samples):
    """Samples equally from instances."""
    input_tensors = {}
    output_tensors = {}
    input_tensors[
        standard_fields.InputDataFields.object_instance_id_image] = tf.reshape(
            inputs[standard_fields.InputDataFields.object_instance_id_image],
            [-1])
    input_tensors[standard_fields.InputDataFields.
                  object_instance_id_image] = isu.map_labels_to_0_to_n(
                      input_tensors[standard_fields.InputDataFields.
                                    object_instance_id_image])
    seed_indices = isu.randomly_select_n_points_per_segment(
        labels=input_tensors[
            standard_fields.InputDataFields.object_instance_id_image],
        num_points=num_samples,
        include_ignore_label=False)
    seed_indices = tf.reshape(seed_indices, [-1])
    for field in standard_fields.get_input_image_fields():
        if field in inputs:
            input_tensors[field] = tf.gather(inputs[field], seed_indices)
    for field in standard_fields.get_output_image_fields():
        if field in outputs:
            output_tensors[field] = tf.gather(outputs[field], seed_indices)
    return input_tensors, output_tensors
예제 #2
0
 def test_map_labels_to_0_to_n2(self):
   labels = tf.constant([[-1, 1, 2],
                         [1, 1, 2]], dtype=tf.int32)
   labels_0_n = isu.map_labels_to_0_to_n(labels)
   expected_labels_0_n = tf.constant([[-1, 0, 1],
                                      [0, 0, 1]], dtype=tf.int32)
   self.assertAllEqual(labels_0_n.numpy(), expected_labels_0_n.numpy())
예제 #3
0
def sample_from_labels_balanced(labels, num_samples, epsilon=1e-5):
    """Samples from labels inverse proportional to their frequency.

  Args:
    labels: A tf.int32 tensor of size [N].
    num_samples: Number of samples.
    epsilon: A very small number.

  Returns:
    indices: A tf.int32 tensor of size [num_samples].
  """
    labels = isu.map_labels_to_0_to_n(labels)
    max_label = tf.reduce_max(labels)
    labels_onehot = tf.one_hot(labels, depth=(max_label + 1), dtype=tf.float32)
    frequencies = tf.reduce_sum(labels_onehot, axis=0)
    inv_frequencies = 1.0 / (frequencies + epsilon)
    inv_frequencies = tf.gather(inv_frequencies, labels)
    return tf.squeeze(tf.random.categorical(
        tf.math.log(tf.expand_dims(inv_frequencies, axis=0)), num_samples),
                      axis=0)