Keras多输入模型构建问题:误将双图合并为6通道训练
问题描述
我需要构建一个Keras多输入模型,但使用netron.app查看模型结构时发现代码存在问题,似乎误将两张3通道图像合并为6通道进行训练。以下是我的代码实现、模型结构及自定义数据生成器返回格式:
原代码实现
# 补全原代码缺失的input_shape参数 conv_base = tf.keras.applications.InceptionResNetV2(weights=None, include_top=False, input_shape=(299, 299, 3)) input_broc = tf.keras.Input(shape=(299, 299, 3)) input_temp = tf.keras.Input(shape=(299, 299, 3)) x_broc = conv_base(input_broc) x_temp = conv_base(input_temp) x_broc = tf.keras.layers.GlobalAveragePooling2D()(x_broc) x_temp = tf.keras.layers.GlobalAveragePooling2D()(x_temp) x = tf.keras.layers.Concatenate()([x_broc, x_temp]) x = tf.keras.layers.Dense(7, activation='softmax')(x) model = tf.keras.Model(inputs=[input_broc, input_temp], outputs=x)
模型结构输出
Model: "model_1" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_5 (InputLayer) [(None, 299, 299, 3) 0 __________________________________________________________________________________________________ input_6 (InputLayer) [(None, 299, 299, 3) 0 __________________________________________________________________________________________________ inception_resnet_v2 (Functional (None, 8, 8, 1536) 54336736 input_5[0][0] input_6[0][0] __________________________________________________________________________________________________ global_average_pooling2d_2 (Glo (None, 1536) 0 inception_resnet_v2[0][0] __________________________________________________________________________________________________ global_average_pooling2d_3 (Glo (None, 1536) 0 inception_resnet_v2[1][0] __________________________________________________________________________________________________ concatenate_1 (Concatenate) (None, 3072) 0 global_average_pooling2d_2[0][0] global_average_pooling2d_3[0][0] __________________________________________________________________________________________________ dense_1 (Dense) (None, 7) 21511 concatenate_1[0][0] ==================================================================================================
自定义数据生成器返回格式
return [X1, X2], y
问题原因与修正方案
问题本质
你的代码并非将两张图像合并为6通道,而是两个输入分支共享了同一个InceptionResNetV2卷积基的权重——Keras中同一层实例被多次调用时,会自动共享其参数,两个输入共用一套卷积特征提取权重。如果你的需求是让两个分支拥有独立的特征提取能力(即各自训练一套卷积参数),则需要修正代码。
修正代码
分别实例化两个独立的InceptionResNetV2卷积基,让两个输入分支各自使用独立的特征提取器:
# 为两个输入分支分别创建独立的卷积基 conv_base_broc = tf.keras.applications.InceptionResNetV2(weights=None, include_top=False, input_shape=(299, 299, 3)) conv_base_temp = tf.keras.applications.InceptionResNetV2(weights=None, include_top=False, input_shape=(299, 299, 3)) input_broc = tf.keras.Input(shape=(299, 299, 3)) input_temp = tf.keras.Input(shape=(299, 299, 3)) # 各自使用独立的卷积基处理输入 x_broc = conv_base_broc(input_broc) x_temp = conv_base_temp(input_temp) x_broc = tf.keras.layers.GlobalAveragePooling2D()(x_broc) x_temp = tf.keras.layers.GlobalAveragePooling2D()(x_temp) x = tf.keras.layers.Concatenate()([x_broc, x_temp]) x = tf.keras.layers.Dense(7, activation='softmax')(x) model = tf.keras.Model(inputs=[input_broc, input_temp], outputs=x)
补充说明
- 你的数据生成器返回
[X1, X2], y的格式完全符合多输入模型的要求,无需修改 - 若你确实需要将两张3通道图像拼接为6通道输入(即单输入6通道图像),则应使用
tf.keras.layers.Concatenate(axis=-1)直接拼接两个输入张量,再送入单个卷积基,但这是完全不同的模型结构,需根据实际需求选择
内容的提问来源于stack exchange,提问作者Pepeeeee
相关产品推荐
相关产品推荐

