如何在张量流 TakeDataset 上使用 file_paths?

Posted

技术标签:

【中文标题】如何在张量流 TakeDataset 上使用 file_paths?【英文标题】:How to use file_paths on a tensorflow TakeDataset? 【发布时间】:2021-12-13 05:31:21 【问题描述】:

我正在尝试使用图像数据集构建图像分类器,在两个目录之间拆分,每个目录一个。

data_dir = 'experimental.data'
batch_size = 9
img_size = (160, 160)

train_ds = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    shuffle=True,
    image_size=img_size,
    batch_size=batch_size)

val_ds = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    shuffle=True,
    image_size=img_size,
    batch_size=batch_size)

class_names = train_ds.class_names
print(class_names)

['false', 'true']


val_batches = tf.data.experimental.cardinality(val_ds)
test_ds = val_ds.take(val_batches // 5)
val_ds = val_ds.skip(val_batches // 5)

当我开始预测我的测试/新图像时,我想将图像路径与预测一起映射到 pandas 数据帧,这样我就可以使用 python 创建一个包含分类图像副本的目录。

file_paths = train_ds.file_paths

在训练数据集上调用 file_paths 参数可以正常工作,但是在使用 skip/take 拆分 test/val 数据集后,出现错误。

file_paths = test_ds.file_paths

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-129-3a6769d8217f> in <module>
----> 1 file_paths = test_ds.file_paths

AttributeError: 'TakeDataset' object has no attribute 'file_paths'

有没有办法使用 file_paths 来完成这项工作?

【问题讨论】:

【参考方案1】:

您可以做的就是自己切片您的验证数据集。这样您就可以访问两个子集的file_paths

test_ds_file_paths = val_ds.file_paths[:val_batches // 5]
val_ds_file_paths = val_ds.file_paths[val_batches // 5:]

test_ds = val_ds.map(lambda image, label: (image[:val_batches // 5], label[:val_batches // 5]))
val_ds = val_ds.map(lambda image, label: (image[val_batches // 5:], label[val_batches // 5:]))

注意tf.keras.utils.image_dataset_from_directory有参数shuffle,默认设置为True。这意味着当您调用take(1) 时,它每次都会返回一个随机样本。将shuffle 设置为False 将确保您始终获得相同的样本。如果您在对数据集进行切片时想要相同的随机行为,则必须生成随机索引。

【讨论】:

以上是关于如何在张量流 TakeDataset 上使用 file_paths?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上使用来自冻结的张量流图的变量

我们可以在 Mac 上拥有多个张量流版本吗?

如何测试我在真实图片上训练过的张量流模型?

如何降级张量流,可能有多个版本?

如何在张量流对象检测中仅检测特定类别的对象

如何使用张量流数据集 (TDFS) 作为张量流模型的输入?