python - 如何从 tf.keras.preprocessing.image_dataset_from_directory() 探索和修改创建的数据集?
问题描述
这是我使用该功能的方式:
dataset = tf.keras.preprocessing.image_dataset_from_directory(
main_directory,
labels='inferred',
image_size=(299, 299),
validation_split=0.1,
subset='training',
seed=123
)
我想像在这个例子中一样探索创建的数据集,特别是它被转换为数据框的部分pandas
。但我的最低目标是检查标签和附加到它的文件数量,只是为了检查它是否确实按预期创建了数据集(子目录是其中图像的相应标签)。
需要明确的main_directory
是,设置如下:
main_directory
- class_a
- 000.jpg
- ...
- class_b
- 100.jpg
- ...
我希望看到数据集显示其信息,如下所示:
label number of images
class_a 100
class_b 100
此外,是否可以删除数据集中的标签和相应的图像?这个想法是如果相应的图像数量小于某个数量或不同的指标,则删除它们。当然可以通过其他方式在此功能之外完成,但我想知道它是否确实可能,如果可以,如何。
编辑:对于额外的上下文,所有这一切的最终目标是训练一个像这样的预训练模型,将本地图像划分为以其类命名的文件夹。如果有更好的方法包括不使用该功能并满足此最终目标,那么它同样受欢迎。谢谢!
解决方案
我认为使用它glob2
来获取所有文件名,根据需要处理它们,然后制作一个简单的加载函数来替换image_dataset_from_directory
.
获取所有文件:
files = glob2.glob('class_*\\*.jpg')
然后根据需要操作此文件名列表。
然后,创建一个函数来加载图像:
def load(file_path):
img = tf.io.read_file(file_path)
img = tf.image.decode_jpeg(img, channels=3)
img = tf.image.convert_image_dtype(img, tf.float32)
img = tf.image.resize(img, size=(299, 299))
label = tf.strings.split(file_path, os.sep)[0]
label = tf.cast(tf.equal(label, 'class_a'), tf.int32)
return img, label
然后为训练创建数据集:
train_ds = tf.data.Dataset.from_tensor_slices(files).map(load).batch(4)
然后训练:
model.fit(train_ds)
推荐阅读
- java - 带有子域的 Spring (Test)RestTemplate 抛出 UnknownHostException
- excel - 如何使用记事本打开非 .txt 文件、附加到文件并保存
- python - 如果前 4 个等于 X 或 Y,则删除最后 2 个挖掘
- pandas-profiling - 不要在熊猫分析中使用索引
- asp.net - 从模型 .NET api 中排除字段
- automation - 如何在赛普拉斯测试期间调用另一个测试
- macos - 没有 .app 包的 Codesign 命令行二进制文件
- javascript - 在二维数组中查找 argmax 的最快方法
- image - Flutter:无法从 ChangeNotifier 获取文件
- php - Laravel Mails Swift_IoException 无法打开文件进行读取