为了账号安全,请及时绑定邮箱和手机立即绑定

等号,关于张量流数据集,并没有真正为变量赋值

等号,关于张量流数据集,并没有真正为变量赋值

慕的地6264312 2023-06-13 19:13:36
在使用 tensorflow 数据集的操作时,我发现了一些有趣的东西。让我先给你看代码:import tensorflow as tfdataset = tf.data.Dataset.range(10)dataset1=dataset.shuffle(10, reshuffle_each_iteration=False) dataset2=dataset.shuffle(10, reshuffle_each_iteration=True)ds11=dataset1.take(7)ds12=dataset1.skip(7)ds21=dataset2.take(7)ds22=dataset2.skip(7)ds22s=ds22.shuffle(7)print(list(dataset2.as_numpy_iterator()))print(list(ds11.as_numpy_iterator()))print(list(ds12.as_numpy_iterator()))print(list(ds21.as_numpy_iterator()))print(list(ds22.as_numpy_iterator()))print(list(ds22s.as_numpy_iterator()))输出:[3, 0, 7, 9, 8, 5, 4, 1, 6, 2][2, 0, 4, 8, 5, 3, 6][1, 9, 7][2, 6, 8, 0, 7, 3, 9][2, 8, 5][1, 0, 2]所以,问题是最后两个打印结果应该有相同的元素(当然不是相同的顺序);但是,如您所见,事实并非如此。我的猜测是ds22并没有真正赋值,而是我们定义了一个如何获取它的操作,所以我们在使用它的时候,可以通过定义的操作自动生成我们需要的数据。或者,谁能解释一下?
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

考虑这段代码


import tensorflow as tf

dataset = tf.data.Dataset.range(10)

dataset1=dataset.shuffle(10, reshuffle_each_iteration=False) 

dataset2=dataset.shuffle(10, reshuffle_each_iteration=True)


ds11=dataset1.take(7)

ds12=dataset1.skip(7)

ds21=dataset2.take(7)


ds22=dataset2.skip(7)

ds22s=ds22 #.shuffle(7)

print(list(dataset2.as_numpy_iterator()))

print(list(ds11.as_numpy_iterator()))

print(list(ds12.as_numpy_iterator()))

print(list(ds21.as_numpy_iterator()))

print(list(ds22.as_numpy_iterator()))

print(list(ds22s.as_numpy_iterator()))

结果是一样的。背后的原因是,当你写的时候,ds22=dataset2.skip(7)你的意思是取前 7 个样本,丢弃它们,然后再取一个并显示它。因此,当您编写print(list(ds22.as_numpy_iterator()))This 时,会从该数据集中读取所有剩余数据并将其作为列表返回。现在,如果您进行赋值,则意味着您拥有与 中完全相同的ds22s对象ds22。因此,通过编写,print(list(ds22s.as_numpy_iterator()))您再次对整个数据集进行了重新迭代,这次应用了不同的改组。如果禁用,reshuffle_each_iteration结果将是相同的,因为在数据集的第二次迭代中,洗牌对齐完全相同。


查看完整回答
反对 回复 2023-06-13
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信