多输入卷积神经网络采用不同数量的图像

数据挖掘 Python 神经网络 深度学习 喀拉斯 张量流
2022-02-28 12:41:30

我正在使用 Keras 构建一个 CNN 模型,该模型将两种类型的图像作为输入(输入 1、输入 2)并产生一个输出。该模型将两个输入分类为一个类,每种类型的图像数量不同。(输入 1 中的图像数量为 1500,输入 2 中的图像数量为 4000)。

这是我的代码:

in1 = Input(...)  
 x = Conv2D(...)(in1)
# rest of the model
 out1 = Dense(...)(x)  

 in2 = Input(...)  
x = Conv2D(...)(in2)
# rest of the model
out2 = Dense(...)(x)  

concatenated_layer = concatenate([out1, out2])  # merge the outputs of the two models
output_layer = Dense(no_classes, activation='softmax', name='prediction')(concatenated_layer)
modal= Model(inputs=[in1, in2], outputs=[output_layer])

图像生成器代码:

input_imgen = ImageDataGenerator(rescale = 1./255, 
                                   shear_range = 0.2, 
                                   zoom_range = 0.2,
                                   rotation_range=5.,
                                   horizontal_flip = True)

test_imgen = ImageDataGenerator()



def generate_generator_multiple(generator,dir1, dir2, batch_size, img_height,img_width):
    genX1 = generator.flow_from_directory(dir1,
                                          target_size = (img_height,img_width),
                                          class_mode = 'categorical',
                                          batch_size = batch_size,
                                          shuffle=False, 
                                          seed=7)

    genX2 = generator.flow_from_directory(dir2,
                                          target_size = (img_height,img_width),
                                          class_mode = 'categorical',
                                          batch_size = batch_size,
                                          shuffle=False, 
                                          seed=7)
    while True:
            X1i = genX1.next()
            X2i = genX2.next()
            yield [X1i[0], X2i[0]], X2i[1]  #Yield both images and their mutual label


inputgenerator=generate_generator_multiple(generator=input_imgen,
                                           dir1=train_iris_data,
                                           dir2=train_face_data,
                                           batch_size=32,
                                           img_height=224,
                                           img_width=224)       

testgenerator=generate_generator_multiple(generator=test_imgen,
                                          dir1=valid_iris_data,
                                          dir2=valid_face_data,
                                          batch_size=1,
                                          img_height=224,
                                          img_width=224)              

我的问题是:

如何确定每种类型的图像的值steps_per_epochvalidation_steps数量是否不同?

一般来说,如何处理采用不同数量图像的多输入卷积神经网络?

1个回答

在这种情况下,您需要定义您的训练集。如果网络的单个输入是一对图像(a,b), 而你只有 1500 个例子b,那么你只有 1500 个训练样例。

如果每张图片在A可以映射到任意图像B,您可以潜在地在B创建这些输入对。如果不是这种情况,哪些图像在A对应于感兴趣的图像B?

或者,如果您不想(或不适合)简单地重复使用图像,您可以考虑通过旋转、裁剪或以其他方式操作该数据集中的图像来增加较小的集合。

要重新初始化生成器,您只需再次执行此代码:

genX2 = generator.flow_from_directory(dir2, target_size = (img_height,img_width), class_mode = 'categorical', batch_size = batch_size, shuffle=False, seed=7)

什么时候genX2.next()不返回任何东西。或者,更pythonic,您可以使用itertools.chain()形成一个能够返回正确数量的观察的生成器:

n_times_through = math.ceil(4000/1500) 
genX2_new = itertools.chain(*([genX2] * n_times_through)