如何在张量流 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?的主要内容,如果未能解决你的问题,请参考以下文章