为功能性keras模型格式化具有多个类别的多个输入,并将其输入模型

时间:2018-07-16 16:09:24

标签: python tensorflow keras

我不知道如何正确地将训练数据输入功能性keras模型。我有两种输入类型:图像数据和浮点数,每个数字都属于一个图像。此数据分为6类。我该如何格式化输入数据以及如何在我的keras网络中对其进行定义? 图像数据由CNN分析,然后应与浮点数连接。之后,将三个密集层用于分类。似乎没有类似于我的问题的示例或教程。

1 个答案:

答案 0 :(得分:1)

两个单独的输入:

imageInput = Input(image_shape) #often, image_shape is (pixelsX, pixelsY, channels)    
floatInput = Input(float_shape) #if one number per image, shape is: (1,)

卷积部分:

convOut = SomeConvLayer(...)(imageInput)
convOut = SomeConvLayer(...)(convOut)
#...
convOut = SomeConvLayer(...)(convOut)

如有必要,请与其他输入类似。

加入两个分支:

#Please make sure you use compatible shapes
#You should probably not have spatial dimensions anymore at this point
#Probably some kind of GloobalPooling:
convOut = GlobalMaxPooling2D()(convOut)

#concatenate the values:
joinedOut = Concatenate()([convOut,floatInput]) 
    #or some floatOut if there were previous layers in the float side

用您的合并输出做更多的事情:

joinedOut = SomeStuff(...)(joinedOut)
joinedOut = Dense(6, ...)(joinedOut)

使用两个输入创建模型:

model = Model([imageInput,floatInput], joinedOut)

使用以下语言进行训练:

model.fit([X_images, X_floats], classes, ...)

classes是一个“单幅热编码”张量,其中包含每个图像的正确类。


但是,没有“一个正确的解决方案”。您可以尝试很多不同的方法,例如在卷积中间的某个位置“加数字”,或者将其相乘,或者在设法以某种方式连接值之后创建更多的卷积。...这是艺术。

输入数据

输入和输出数据应为 numpy数组

数组的形状应为:

- Image input: `(number_of_images, side1, side2, channels)`    
- Floats input: `(number_of_images, number_of_floats_per_image)`    
- Outputs: `(number_of_images, number_of_classes)`   

Keras将了解这些形状的所有必要信息,所有数组中的行0将是图像0,行1将是图像1,依此类推。