我希望使用不同的目标向量(不是标准的单热编码)来训练我的CNN。我的图像数据位于10个不同的文件夹中(10个不同的类别)。我如何使用我想要的目标向量? flow_from_directory()
输出一个热门编码的标签数组。我有标签向量存储在字典中。此外,文件夹的名称是标签,如果这有帮助。
答案 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_generator
或evaluate_generator
推理时间):
model.fit_generator(custom_generator(train_generator), # the rest of args)