【问题标题】:Equal sign, regarding to tensorflow dataset, does not really assign values to variable等号,关于张量流数据集,并没有真正为变量赋值
【发布时间】:2020-08-22 12:22:49
【问题描述】:

我在使用 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并不是真正赋值的,而是我们定义了如何获取它的操作,所以当我们使用它时,我们需要的数据可以由定义的操作。

或者,谁能解释一下?

【问题讨论】:

    标签: python tensorflow shuffle tensorflow-datasets


    【解决方案1】:

    考虑这段代码

    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())) 时,它会从该数据集中读取所有剩余数据并将其作为列表返回。 现在,如果您进行分配,则意味着您在ds22s 中拥有与ds22 中完全相同的对象。因此,通过编写print(list(ds22s.as_numpy_iterator())),您再次在整个数据集上重新迭代,这次应用了不同的改组。如果禁用reshuffle_each_iteration,结果将是相同的,因为在数据集的第二次迭代中,改组对齐方式完全相同。 我希望这回答了你的问题。欢迎询问详情。

    【讨论】:

    • 哦!谢谢!所以ds22实际上是一个对象,而不是像numpy矩阵这样的一些真实值,对吧?那么,你的回答对我来说确实很有意义。谢谢!
    • @Trunway 乐于助人 :) 确实如此,ds22s 是对与 ds22 相同对象的引用。如果你懂一点python,在shuffleskip等每个函数的末尾,你会返回指向self的指针。所以,是的,它实际上是一个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2021-07-03
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2018-08-04
    • 2012-02-04
    相关资源
    最近更新 更多