压缩两个数据集时,从不选择某些样本

时间:2018-03-19 13:37:21

标签: python tensorflow

在压缩两个数据集时,为什么一些样本永远不会被挑选?考虑一下这个玩具示例:

import tensorflow as tf

# first dataset of length 3: [0..2]
d1 = tf.data.Dataset.range(3)
# second dataset of length 5: [100..104]
d2 = tf.data.Dataset.range(100, 105)

d = tf.data.Dataset.zip((d1, d2)).repeat()
batch = d.make_one_shot_iterator().get_next()

sess = tf.InteractiveSession()
for _ in range(10):
  print(sess.run(batch))

此输出

(0, 100)
(1, 101)
(2, 102)
(0, 100)
(1, 101)
(2, 102)
(0, 100)
(1, 101)
(2, 102)
(0, 100)

d2的最后10个样本从未被选中。

1 个答案:

答案 0 :(得分:0)

当两个压缩的Datasets长度不同时会发生这种情况。问题是当repeat捕获OutOfRangeError发出的d1时,它会重置d1 d2。所以d2即使没有到达终点也会重新开始。

您可以考虑通过使其循环来从最短的数据集中抑制OutOfRangeError

import tensorflow as tf

d1 = tf.data.Dataset.range(3).repeat()
d2 = tf.data.Dataset.range(100, 105)

d = tf.data.Dataset.zip((d1, d2)).repeat()
batch = d.make_one_shot_iterator().get_next()

sess = tf.InteractiveSession()
for _ in range(10):
  print(sess.run(batch))

但这带来了一个更微妙的问题:

(0, 100)
(1, 101)
(2, 102)
(0, 103)
(1, 104)
(0, 100)
(1, 101)
(2, 102)
(0, 103)
(1, 104)

现在绘制了所有样本,但不是平等的:d2现在到达结束时会发出OutOfRangeError,并重新初始化d1。因此d1的第一个样本更可能被选为最后一个样本。 (如果d1被洗牌,这仍然是正确的,因为洗牌发生在不是无限长度的缓冲区中。)

在压缩它们之前,解决方案是repeat两个数据集

import tensorflow as tf

d1 = tf.data.Dataset.range(3).repeat()
d2 = tf.data.Dataset.range(100, 105).repeat()

d = tf.data.Dataset.zip((d1, d2))
batch = d.make_one_shot_iterator().get_next()

sess = tf.InteractiveSession()
for _ in range(10):
  print(sess.run(batch))

输出

(0, 100)
(1, 101)
(2, 102)
(0, 103)
(1, 104)
(2, 100)
(0, 101)
(1, 102)
(2, 103)
(0, 104)

这允许您使用count repeat对该数据集的this->参数,根据对给定问题有意义的内容限制其中一个数据集的时期。 / p>