以下是我使用该函数的方式:
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 imagesclass_a 100class_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)