我正在尝试使用图像数据集构建一个图像分类器,分为两个目录,每个目录一个。
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 来完成这项工作?
您收到错误是因为
.file_paths
不是 DatasetV2 的属性。
在下一行
here中调用
.file_paths
后,属性 tf.keras.utils.image_dataset_from_directory
将添加到 DatasetV2 对象。
因此,调用
val_ds.take(val_batches // 5)
后,返回不带 .file_paths
属性的 DatasetV2。
解决方案
file_paths=val_ds.file_paths
val_batches = tf.data.experimental.cardinality(val_ds)
test_ds = val_ds.take(val_batches // 5)
val_ds = val_ds.skip(val_batches // 5)
test_file_paths = file_paths[:val_batches // 5]
val_file_paths = file_paths[val_batches // 5:]