tf.Data.Dataset-在每个纪元上,仅使用完整数据集的子样本进行训练

时间:2019-10-23 10:16:33

标签: python tensorflow

我有一个图像数据集,其中正样本和负样本的失衡很大(许多负样本)。我想创建一个tf.data.Dataset,每个历元将训练所有正样本,但仅负样本(ratio * len(positive))。

我目前正在使用从keras.util.Sequence继承的数据源来实现此目的,并且使用这种子采样策略比对所有数据进行训练要好得多。

但是阅读Dataset上的文档后,我似乎找不到解决方法,有可能吗?

在现有的数据生成器中,我正在这样做:

# List if indicies of the positive and negative samples
positives = np.where(self.labels == 1)[0]
negatives = np.where(self.labels == 0)[0]
# How many of the negatives do we want to use?
n_negatives = np.clip(int(len(positives) * self.config.DATASET_NEGSUBSAMPLE_RATIO), 1, len(negatives))
# Choose random negatives
subsampled_negatives = np.random.choice(negatives, n_negatives, replace=False)
# Create the incidies array from the positive and subsamples negative indicies
self.indexes = np.concatenate((positives, subsampled_negatives))
# Shuffle them together
np.random.shuffle(self.indexes)

1 个答案:

答案 0 :(得分:1)

positivesnegatives的定义与问题相同。

positives = [(0,1),(1,1),(2,1),(3,1),(4,1)]
negatives = [(10,0),(11,0),(12,0),(13,0),(14,0),(15,0),(16,0)]

NEGATIVE_SAMPLES = 3

pos_ds = tf.data.Dataset.from_tensor_slices(positives)
neg_ds = tf.data.Dataset.from_tensor_slices(negatives).shuffle(1000)

ds = pos_ds.concatenate(neg_ds.take(NEGATIVE_SAMPLES)).shuffle(1000)

els = [v.numpy().tolist() for v in list(ds)]

打印els进行示例执行可以得到:

[[0, 1], [4, 1], [12, 0], [16, 0], [1, 1], [10, 0], [3, 1], [2, 1]]

注意:您可能需要在ds定义的末尾试用随机播放的缓冲区大小。