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
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())
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)