tensorflow - TensorFlow 在预处理期间对数据进行两次混洗
问题描述
在 TensorFlow Load Images教程中,作者在使用 tf.data 时似乎对数据进行了两次混洗:
list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'), shuffle=False)
list_ds = list_ds.shuffle(image_count, reshuffle_each_iteration=False) # <-- first shuffling
val_size = int(image_count * 0.2)
train_ds = list_ds.skip(val_size)
val_ds = list_ds.take(val_size)
...
def configure_for_performance(ds):
ds = ds.cache()
ds = ds.shuffle(buffer_size=1000) # <-- second shuffling
ds = ds.batch(batch_size)
ds = ds.prefetch(buffer_size=AUTOTUNE)
return ds
train_ds = configure_for_performance(train_ds)
val_ds = configure_for_performance(val_ds)
我的问题是,第二次改组是否有必要或产生我不知道的任何其他优势?此外,为什么将 buffer_size 设置为 1000 而不是在那里也使用 AUTOTUNE?
解决方案
他们出于不同的原因洗牌两次:
- 第一次洗牌是为了得到一个洗牌和一致的波谷时期训练/验证分裂。
- 第二次洗牌是在每个时期洗牌训练数据集。
说明:
该
shuffle
方法有一个特定的参数reshuffle_each_iteration
,默认为True
. 这意味着每当数据集用尽时,整个数据集都会重新洗牌。如果在调用 , 后将一个数据集拆分为两个shuffle
(以获得随机拆分),则当数据集耗尽时,整个数据集将在拆分前重新洗牌。然后将训练集和验证集混合在一起。因此,要获得随机拆分,但在 epoch 之间保持一致,请使用 shufflereshuffle_each_iteration=False
然后,对于训练集,最好在每个 epoch 以不同的顺序为模型提供数据,因此调用第二次 shuffle。
对于您的第二个问题,tf.data.AUTOTUNE
根本不兼容shuffle
.
推荐阅读
- ios - 如何管理企业分发临时配置文件到期?
- html - HTML 中的 URL 和所需链接的 URL 不相同
- awk - 使用 bash 进行基于列和行的修改
- ios - 可以在 xcode 项目文件中使用 fastlane 命令配置 Jenkins 管道
- google-chrome - Codeception,如何填写日期选择器或按数字
- asp.net-core - 确定 [Authorize] 策略失败原因的最佳方法是什么?
- angular - Angular v6 管道(map())问题
- java - 获取当前ec2实例的hostName和Instance Id
- sql - 通过 SQL 生成每个客户每月的销售报告,例如按两列分组并对第三列求和
- casting - 无法创建从发送方到接收方的通信 CAF v3