等号,关于张量流数据集,并没有真正为变量赋值
Equal sign, regarding to tensorflow dataset, does not really assign values to variable
在使用tensorflow数据集的操作时,我发现了一些有趣的东西。让我先给你看代码:
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()))
输出:
[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并不是真正的赋值,而是我们定义了一个如何获取它的操作,所以我们在使用的时候,我们需要的数据可以由定义的操作自动生成。
或者,谁能解释一下?
考虑这段代码
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()))
这将从该数据集中读取所有剩余数据并将其 returns 作为列表读取。
现在,如果您进行赋值,则意味着您在 ds22s
中拥有与 ds22
中完全相同的对象。因此,通过在整个数据集上再次写入 print(list(ds22s.as_numpy_iterator()))
你 re-iterate,这次应用了不同的改组。如果禁用 reshuffle_each_iteration
,结果将是相同的,因为在数据集的第二次迭代中,洗牌对齐完全相同。
我希望这回答了你的问题。欢迎询问详情。
在使用tensorflow数据集的操作时,我发现了一些有趣的东西。让我先给你看代码:
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()))
输出:
[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并不是真正的赋值,而是我们定义了一个如何获取它的操作,所以我们在使用的时候,我们需要的数据可以由定义的操作自动生成。
或者,谁能解释一下?
考虑这段代码
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()))
这将从该数据集中读取所有剩余数据并将其 returns 作为列表读取。
现在,如果您进行赋值,则意味着您在 ds22s
中拥有与 ds22
中完全相同的对象。因此,通过在整个数据集上再次写入 print(list(ds22s.as_numpy_iterator()))
你 re-iterate,这次应用了不同的改组。如果禁用 reshuffle_each_iteration
,结果将是相同的,因为在数据集的第二次迭代中,洗牌对齐完全相同。
我希望这回答了你的问题。欢迎询问详情。