【问题标题】:Shuffle TFRecordDataset files but not samples inside the files随机播放 TFRecordDataset 文件,但不随机播放文件内的样本
【发布时间】:2019-11-18 21:12:19
【问题描述】:

我已生成数据并将其保存到多个 tfrecord 文件中,然后将这些文件加载​​到 TFRecordDataset 中。 如何按文件打乱这个数据集?也就是说,我想保持样本的顺序文件中,但只在创建时随机化加载文件的顺序批处理数据集。考虑以下示例:

数据

file_1
  file_1_s1
  file_1_s2
  file_1_s3


file_2
  file_2_s1
  file_2_s2
  file_2_s3


file_3
  file_3_s1
  file_3_s2
  file_3_s3

法定样品订购

file_1_s2, file_1_s2, file_1_s3, file_3_s1, file_3_s2, file_3_s3, file_2_s1, file_2_s2, file_2_s3
file_3_s1, file_3_s2, file_3_s3, file_2_s1, file_2_s2, file_2_s3, file_1_s2, file_1_s2, file_1_s3

非法样品订购

file_1_s2, file_1_s3, file_3_s3, file_2_s1, file_2_s2, file_1_s2, file_3_s2, file_3_s1, file_2_s3
file_3_s1, file_2_s1, file_3_s3, file_2_s2, file_2_s3, file_1_s2, file_1_s2, file_1_s3, file_3_s2

在非法示例中,一个文件的样本不再一起或按顺序出现。

【问题讨论】:

  • 为什么不在将 tfrecord 文件名的 python 列表发送到 tf.data.Dataset 之前随机排序?
  • 因为我想洗牌每个时代。所以我每次都需要重新创建数据集。 @gobrewers14

标签: tensorflow tensorflow-datasets tfrecord


【解决方案1】:

您可以使用tf.data.Dataset.list_files 来打乱您的TFRecord 文件,如下所示。

filepaths = ["data.tfrecords","data1.tfrecords","data2.tfrecords","data3.tfrecords"]

filepath_dataset = tf.data.Dataset.list_files(filepaths, seed=42)

print(filepath_dataset)

<ShuffleDataset shapes: (), types: tf.string>

for file in filepath_dataset:
  print(file)

洗牌数据集:

tf.Tensor(b'./data1.tfrecords', shape=(), dtype=string)
tf.Tensor(b'./data3.tfrecords', shape=(), dtype=string)
tf.Tensor(b'./data2.tfrecords', shape=(), dtype=string)
tf.Tensor(b'./data.tfrecords', shape=(), dtype=string)

list_files 接受 3 个参数。
文件: 字符串、字符串列表或字符串类型(标量或向量)的 tf.Tensor,表示文件名将匹配的 glob(即 shell 通配符)模式。
shuffle: 默认设置为 True,它会随机打乱文件。
种子: (可选。)一个 tf.int64 标量 tf.Tensor,表示将用于创建分布的随机种子。

返回对应于文件名的字符串数据集。

希望这能回答您的问题,祝您学习愉快!

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2023-01-23
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    相关资源
    最近更新 更多