如何在keras flow_from_directory中手动指定类标签?

Mal*_*lte 17 python image-processing multilabel-classification deep-learning keras

问题:我正在训练多标签图像识别模型.因此,我的图像与多个y标签相关联.这与ImageDataGenerator的方便的keras方法"flow_from_directory"相冲突,其中每个图像应该位于相应标签的文件夹中(https://keras.io/preprocessing/image/).

解决方法:目前,我正在将所有图像读入一个numpy数组并从那里使用"flow"函数.但这会导致大量内存负载和缓慢的读入过程.

问题:有没有办法使用"flow_from_directory"方法并手动提供(多个)类标签?


更新:我最终扩展了多标签案例的DirectoryIterator类.您现在可以将属性"class_mode"设置为值"multilabel",并提供字典"multlabel_classes",它将文件名映射到其标签.代码:https://github.com/tholor/keras/commit/29ceafca3c4792cb480829c5768510e4bdb489c5

Mar*_*jko 9

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

在哪里multiclasses_getter为图像指定多类矢量/多类表示.需要注意的是xy不是的例子一个例子,但批次,所以这应该被包含在你multiclasses_getter的设计.


gaw*_*w89 3

您可以编写一个自定义生成器类,该类将从目录中读取文件并应用标签。该自定义生成器还可以接受 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)
Run Code Online (Sandbox Code Playgroud)

然后简单地:

img_gen = ImageDataGenerator(...)
gen = Generator(X, Y, img_gen, 128)

model.fit_generator(gen.get_next_batch(), ...)
Run Code Online (Sandbox Code Playgroud)

*免责声明:我还没有实际测试过这一点,但理论上它应该有效。