You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:53:17