如何在keras flow_from_directory中手动指定class标签?
How to manually specify class labels in keras flow_from_directory?
问题:我正在训练多标签图像识别模型。因此,我的图像与多个 y 标签相关联。这与 ImageDataGenerator 的方便的 keras 方法 "flow_from_directory" 冲突,其中每个图像都应该在相应标签的文件夹中 (https://keras.io/preprocessing/image/)。
解决方法: 目前,我正在将所有图像读取到一个 numpy 数组中,并从那里使用 "flow" 函数。但这会导致沉重的内存负载和缓慢的读入过程。
问题:有没有办法使用 "flow_from_directory" 方法并手动提供(多个)class 标签?
更新:我最终为多标签案例扩展了 DirectoryIterator class。您现在可以将属性 "class_mode" 设置为值 "multilabel" 并提供将文件名映射到其标签的字典 "multlabel_classes"。代码:https://github.com/tholor/keras/commit/29ceafca3c4792cb480829c5768510e4bdb489c5
您可以编写自定义生成器 class 从目录中读取文件并应用标签。该自定义生成器还可以接收一个 ImageDataGenerator 实例,该实例将使用 flow() 生成批次。
我正在想象这样的事情:
class Generator():
def __init__(self, X, Y, img_data_gen, batch_size):
self.X = X
self.Y = Y # Maybe a file that has the appropriate label mapping?
self.img_data_gen = img_data_gen # The ImageDataGenerator Instance
self.batch_size = batch_size
def apply_labels(self):
# Code to apply labels to each sample based on self.X and self.Y
def get_next_batch(self):
"""Get the next training batch"""
self.img_data_gen.flow(self.X, self.Y, self.batch_size)
然后简单地:
img_gen = ImageDataGenerator(...)
gen = Generator(X, Y, img_gen, 128)
model.fit_generator(gen.get_next_batch(), ...)
*免责声明:我还没有实际测试过,但理论上应该可行。
您可以简单地使用 flow_from_directory
并按以下方式将其扩展到多类:
def multiclass_flow_from_directory(flow_from_directory_gen, multiclasses_getter):
for x, y in flow_from_directory_gen:
yield x, multiclasses_getter(x, y)
其中 multiclasses_getter
正在为图像分配多类向量/多类表示。请注意,x
和 y
不是单个示例,而是成批示例,因此这应该包含在您的 multiclasses_getter
设计中。
# Training the model
history = model.fit(train_generator, steps_per_epoch=steps_per_epoch, epochs=3, validation_data=val_generator,validation_steps=validation_steps, verbose=1,
callbacks= keras.callbacks.ModelCheckpoint(filepath='/content/results',monitor='val_accuracy', save_best_only=True,save_weights_only=False))
validation_steps
或steps_per_epoch
可能会超出原参数。
steps_per_epoch= (int(num_of_training_examples/batch_size)
可能会有帮助。
同样 validation_steps= (int(num_of_val_examples/batch_size)
会有所帮助
问题:我正在训练多标签图像识别模型。因此,我的图像与多个 y 标签相关联。这与 ImageDataGenerator 的方便的 keras 方法 "flow_from_directory" 冲突,其中每个图像都应该在相应标签的文件夹中 (https://keras.io/preprocessing/image/)。
解决方法: 目前,我正在将所有图像读取到一个 numpy 数组中,并从那里使用 "flow" 函数。但这会导致沉重的内存负载和缓慢的读入过程。
问题:有没有办法使用 "flow_from_directory" 方法并手动提供(多个)class 标签?
更新:我最终为多标签案例扩展了 DirectoryIterator class。您现在可以将属性 "class_mode" 设置为值 "multilabel" 并提供将文件名映射到其标签的字典 "multlabel_classes"。代码:https://github.com/tholor/keras/commit/29ceafca3c4792cb480829c5768510e4bdb489c5
您可以编写自定义生成器 class 从目录中读取文件并应用标签。该自定义生成器还可以接收一个 ImageDataGenerator 实例,该实例将使用 flow() 生成批次。
我正在想象这样的事情:
class Generator():
def __init__(self, X, Y, img_data_gen, batch_size):
self.X = X
self.Y = Y # Maybe a file that has the appropriate label mapping?
self.img_data_gen = img_data_gen # The ImageDataGenerator Instance
self.batch_size = batch_size
def apply_labels(self):
# Code to apply labels to each sample based on self.X and self.Y
def get_next_batch(self):
"""Get the next training batch"""
self.img_data_gen.flow(self.X, self.Y, self.batch_size)
然后简单地:
img_gen = ImageDataGenerator(...)
gen = Generator(X, Y, img_gen, 128)
model.fit_generator(gen.get_next_batch(), ...)
*免责声明:我还没有实际测试过,但理论上应该可行。
您可以简单地使用 flow_from_directory
并按以下方式将其扩展到多类:
def multiclass_flow_from_directory(flow_from_directory_gen, multiclasses_getter):
for x, y in flow_from_directory_gen:
yield x, multiclasses_getter(x, y)
其中 multiclasses_getter
正在为图像分配多类向量/多类表示。请注意,x
和 y
不是单个示例,而是成批示例,因此这应该包含在您的 multiclasses_getter
设计中。
# Training the model
history = model.fit(train_generator, steps_per_epoch=steps_per_epoch, epochs=3, validation_data=val_generator,validation_steps=validation_steps, verbose=1,
callbacks= keras.callbacks.ModelCheckpoint(filepath='/content/results',monitor='val_accuracy', save_best_only=True,save_weights_only=False))
validation_steps
或steps_per_epoch
可能会超出原参数。
steps_per_epoch= (int(num_of_training_examples/batch_size)
可能会有帮助。
同样 validation_steps= (int(num_of_val_examples/batch_size)
会有所帮助