为什么使用tf.data.Dataset.zip合并两个数据集时部分样本从未被选中?
为什么用tf.data.Dataset.zip合并两个数据集时部分样本从未被选中?
这事儿我太清楚啦!你遇到的问题其实是tf.data.Dataset.zip()的工作机制导致的,咱一步步拆解:
问题根源
tf.data.Dataset.zip()的逻辑和Python原生zip()完全一致:只会以两个数据集中长度较短的那个为上限,进行元素配对。
看你的示例:
- 数据集d1长度为3,元素是
[0, 1, 2] - 数据集d2长度为5,元素是
[100, 101, 102, 103, 104]
当执行zip((d1, d2))时,程序只会配对到两个数据集都有对应元素的位置:d1的0配d2的100,d1的1配d2的101,d1的2配d2的102。此时d1已经没有剩余元素,d2里的103、104就彻底没机会参与配对了。
之后你调用.repeat(),其实是把前面生成的3组配对结果无限循环,所以输出永远是这3组的重复,103和104自然永远不会出现。
解决方案
如果你希望两个数据集的所有元素都能被用到,比如让短数据集循环起来,和长数据集的所有元素配对,可以先把两个数据集各自转为无限序列,再进行zip:
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))
运行这段代码后,你就能看到d2的103、104也会被配对输出,比如会出现(0, 103)、(1, 104)这类组合,所有元素都能被循环利用啦。
内容的提问来源于stack exchange,提问作者P-Gn
相关产品推荐
相关产品推荐

