Python Tensorflow数据集关于.shuffle、.batch和.repeat的问题

Python Tensorflow数据集关于.shuffle、.batch和.repeat的问题,python,tensorflow,tensorflow-datasets,Python,Tensorflow,Tensorflow Datasets,我有一个关于使用tf.Dataset的batch、repeat和shuffle的问题 我不清楚重复和洗牌是如何使用的。我知道.batch将决定有多少训练示例将经历随机梯度下降,我仍然不清楚.repeat和的用法 第一个问题 即使在查看和之后,.repeat用于在抛出tf.errors.OutOfRangeError后在数据集上重复。因此,在我的代码中,这是否意味着我不再需要实现: try: while True: _ = sess.run(self.optimizer)

我有一个关于使用tf.Dataset的batch、repeat和shuffle的问题

我不清楚重复和洗牌是如何使用的。我知道
.batch
将决定有多少训练示例将经历随机梯度下降,我仍然不清楚
.repeat
的用法

第一个问题

即使在查看和之后,
.repeat
用于在抛出
tf.errors.OutOfRangeError
后在数据集上重复。因此,在我的代码中,这是否意味着我不再需要实现:

try:
    while True:
        _ = sess.run(self.optimizer)

except tf.errors.OutOfRangeError:
        pass
因为
.repeat
会在数据集用完后自动重复数据集吗?什么时候停?或者它永远不会停止,并且一旦通过了一定数量的批(比如1000个),您就必须退出while True循环

第二个问题

其次,使用
.shuffle
对我来说毫无意义。
.shuffle.batch()
是否意味着我有100000个样本,用
.shuffle
随机放入1000个缓冲区,然后用
.batch()
批处理100个样本。据我所知,下一批将使用999个样本,并在缓冲区中放置1个新样本。因此,如果我的示例对它们没有顺序,那么应该一起避免
.shuffle
?如果使用
.batch
,它仍然会从缓冲区中的999+1中批处理100

第三个问题

<>和最后,如果我使用一个单独的<代码> TD.DataSet < /Cord>对象进行测试,那么我应该考虑什么样的顺序< <代码> .Stuffle?BatChh()?现在我使用:

sess.run(self.test_init)
try:
    while True:
        accuracy_batch = sess.run(self.accuracy)

except tf.errors.OutOfRangeError:
    pass
与:

我有超过110000个培训示例可供使用,因此self.batch_size将设置我要用于测试准确性的样本数。所以,如果我只想测试整个测试数据集,我不会使用
.batch
?但是因为我让它用
迭代整个数据集,而True则是
,所以没有什么区别?通过使用
.shuffle
我注意到我的准确度发生了变化,但没有它,它们非常相似。这让我觉得
.shuffle
是在随机分组,可能是在重复使用培训示例?

第一个问题: 这是正确的-如果输入数据集,则不再需要捕获
OutOfRangeError

repeat()
接受一个可选参数,表示它应该重复的次数。这意味着
repeat(10)
将在整个数据集上迭代10次。如果你选择省略这个参数,那么它将不确定地重复

第二个问题
Shuffle()

首先通过按顺序添加记录来填充缓冲区,然后,一旦填满,将选择并发出一个随机的记录,并从原始源读取一个新记录

如果你有

ds.shuffle(1000).批处理(100)
然后,为了返回单个批次,最后一步重复100次(将缓冲区保持在1000)。批处理是一个单独的操作

第三项质询 通常,我们根本不洗牌测试集,只洗牌训练集(我们使用整个测试集进行评估,对吗?为什么洗牌?)

所以,如果我只想测试整个测试数据集,我不会使用
.batch


嗯-不是这样(至少不总是这样)。如果您的整个测试数据集不适合内存,那么您肯定需要使用批处理—这是常见的情况。您可能希望测试整个数据集,但要在可管理的数据位中运行这些数字

此问题与您使用的
批处理文件
标记无关。您只需将鼠标悬停在标签上,即可阅读标签的说明。。。我建议您编辑标记并删除
批处理文件
一个…我已经回答了其中的每一个问题,但值得记住的是,这可能真的应该是3个独立的堆栈溢出问题。最好能让每一个都尽可能具体。谢谢你的评论。唯一的问题我还是你对我第二个问题的答案。我不明白为什么。使用shuffle以及在什么情况下应该使用它。使用.shuffle(1000)从一组有序示例中获得.batch(100)有什么意义?当I.batch(100)时,我是否没有获得100个随机示例?如果我事先随机抽取我的训练集,按顺序抽取100个样本与抽取100个随机样本是一样的。我问的有意义吗?
batch(100)
按顺序获取接下来的100条记录。它本身不会以任何方式洗牌或随机排列顺序。因此。洗牌(1000)将从训练集中抽取并洗牌1000个项目,而批处理(100)将从1000个洗牌批次中抽取100个已排序的项目?所以,当我返回并运行下一个迭代时,它会绘制一个全新的1000和100批次吗?或者它会继续从原来的1000桶中抽取下一批吗?那么,它将只使用1000个例子吗?或者,它还会继续下去,直到训练集耗尽?对不起,有额外的问题@JamieDimon的后续问题通常应该是关于堆栈溢出的新问题。尽管如此:洗牌(1000)不会“抽1000”。它通过加载内存中的前1000个,然后随机选取一个,然后加载下一个,然后重复,直到超过整个集合,从而洗牌整个集合。默认情况下,它每次都会洗牌,但我们可以传递一个可选的
reshuffle\u each\u iteration=False
,如果我们希望它只洗牌一次,那么重用还需要澄清
batch(100)
也可以在整个数据集上工作。我在上面的评论旨在通过说明第一批是如何生成的,来强调没有洗牌。为清楚起见,
batch(100)
将把一个500条记录的数据集(形状为
(2,3)
)转换为一个5条记录的数据集
test_data = self.test_dataset.shuffle(self.batch_size).batch(self.batch_size)