Art*_*eat 2 tensorflow tensorflow-datasets
考虑这个问题:从图像数据集(如 ImageNet)中的随机主题中选择随机数量的样本作为 Tensorflow 图的输入元素,该图用作对象集识别器。对于每个批次,每个类都有相同数量的样本以方便计算。但是对于一个类,不同的批次会有不同数量的图像,即 batch_0: num_imgs_per_cls=2; 批次_1000:num_imgs_per_cls=3。
如果 Tensorflow 中存在现有功能,我们将非常感谢从头开始(例如从图像目录)对整个过程的解释。
@mrry here有一个非常相似的答案。
在人脸识别中,我们经常使用三元组损失(或类似损失)来训练模型。对三元组进行采样以计算损失的常用方法是创建一批平衡的图像,例如我们有 10 个不同的类(即 10 个不同的人),每个类有 5 个图像。在此示例中,这给出了 50 的总批次大小。
更一般的问题是对num_classes_per_batch类进行采样(示例中为10 个),然后num_images_per_class为每个类采样(示例中为 5 个)图像。总批次大小为:
batch_size = num_classes_per_batch * num_images_per_class
Run Code Online (Sandbox Code Playgroud)
处理许多不同类别(MS-Celeb 中为 100,000)的最简单方法是为每个类别创建一个数据集。
例如,您可以为每个类创建一个 tfrecord 并创建如下数据集:
# Build one dataset per class.
filenames = ["class_0.tfrecords", "class_1.tfrecords"...]
per_class_datasets = [tf.data.TFRecordDataset(f).repeat(None) for f in filenames]
Run Code Online (Sandbox Code Playgroud)
现在我们希望能够从这些数据集中采样。例如,我们希望批次中有以下标签:
1 1 1 3 3 3 9 9 9 4 4 4
Run Code Online (Sandbox Code Playgroud)
这对应于num_classes_per_batch=4和num_images_per_class=3。
为此,我们需要使用将在r1.9. 应该调用该函数tf.contrib.data.choose_from_datasets(有关此问题的讨论,请参见此处)。
它应该看起来像:
1 1 1 3 3 3 9 9 9 4 4 4
Run Code Online (Sandbox Code Playgroud)
因此,我们创建了selector它将输出1 1 1 3 3 3 9 9 9 4 4 4并将其与它结合datasets以获得我们将输出平衡批次的最终数据集:
def choose_from_datasets(datasets, selector):
"""Chooses elements with indices from selector among the datasets in `datasets`."""
Run Code Online (Sandbox Code Playgroud)
您可以使用每晚的 TensorFlow 构建并DirectedInterleaveDataset作为解决方法进行测试:
def generator(_):
# Sample `num_classes_per_batch` classes for the batch
sampled = tf.random_shuffle(tf.range(num_classes))[:num_classes_per_batch]
# Repeat each element `num_images_per_class` times
batch_labels = tf.tile(tf.expand_dims(sampled, -1), [1, num_images_per_class])
return tf.to_int64(tf.reshape(batch_labels, [-1]))
selector = tf.contrib.data.Counter().map(generator)
selector = selector.apply(tf.contrib.data.unbatch())
dataset = tf.contrib.data.choose_from_datasets(datasets, selector)
# Batch
batch_size = num_classes_per_batch * num_images_per_class
dataset = dataset.batch(batch_size)
Run Code Online (Sandbox Code Playgroud)
我还在此处写了有关此解决方法的文章。
| 归档时间: |
|
| 查看次数: |
841 次 |
| 最近记录: |