为CNN使用不同的目标向量

时间:2018-06-18 21:04:47

标签: python keras deep-learning conv-neural-network

我希望使用不同的目标向量(不是标准的单热编码)来训练我的CNN。我的图像数据位于10个不同的文件夹中(10个不同的类别)。我如何使用我想要的目标向量? flow_from_directory()输出一个热门编码的标签数组。我有标签向量存储在字典中。此外,文件夹的名称是标签,如果这有帮助。

1 个答案:

答案 0 :(得分:0)

你可能知道Keras中的ImageDataGenerator是一个python生成器(如果你不熟悉python生成器,你可以阅读更多关于它们的here)。由于您想要使用自定义目标向量(而不是从flow_from_directory()生成的向量),您可以通过将图像生成器包含在另一个函数中来操纵图像生成器的行为。方法如下:

首先,我们需要将自定义目标存储为numpy数组:

# a numpy array containing the custom targets for each class
# custom_target[0] is target vector of class #1 images
# custom_target[1] is target vector of class #2 images
# etc.
custom_targets = your_custom_targets

其次,我们像往常一样创建一个图像生成器,并使用flow_from_directory从磁盘读取图像。您需要将class_mode参数设置为'sparse'以获取每个图像的类索引。此外,您可以将classes参数设置为包含类名称(即目录)的列表。如果你没有设置这个参数,那么将映射到标签索引的类的顺序将是字母数字(即0用于按字母顺序排列最高的类,依此类推):

train_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(150, 150),
        batch_size=32,
        class_mode='sparse') # NOTE: set class_mode to sparse to generate integer indices

注意:如果您未设置classes参数,请确保custom_target[i]按字母顺序与i - 类对应。)

现在我们可以将我们的生成器包装在另一个函数中,并生成一批图像及其相应的数字标签,用于生成我们自己的标签:

def custom_generator(generator):
    for data, labels in generator:
        # get the custom labels corresponding to each class
        custom_labels = custom_targets[labels]
        yield data, custom_labels

就是这样!现在我们有一个自定义生成器,我们可以像其他任何生成器一样将其传递给fit_generator(或predict_generatorevaluate_generator推理时间):

model.fit_generator(custom_generator(train_generator), # the rest of args)