在压缩两个数据集时,为什么一些样本永远不会被挑选?考虑一下这个玩具示例:
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个样本从未被选中。
答案 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>