Keras多输入模型拼接报错:InvalidArgumentError问题求助
问题定位与修复方案
核心问题
错误提示已经明确指出:拼接时除拼接维度外,所有维度必须匹配。这里sec_flatten的形状是[32, 1],而nat_flatten是[1, 936],batch维度完全不匹配,根源在于sec_input的模型定义和生成器输出的形状不对应,同时模型还有一处小bug影响层的执行逻辑。
具体问题拆解:
- 输入形状不匹配
- 模型中
sec_input定义为shape=(window, 1),意味着单样本输入是(32,1)的2D张量 - 但生成器输出的
X_train_sec_i是(32,)的1D张量,既缺少最后一个维度,也没有和另外两个输入一致的batch维度(另外两个输入都是(1,32,...)的带batch格式)
- 模型中
- 层连接错误
nat_pooling_2和act_pooling_2的输入写错了,跳过了定义好的BatchNormalization层,直接用了Conv2D的输出,导致BN层未生效。
修复步骤
1. 修正生成器中sec输入的形状
把X_train_sec_i调整为和模型输入定义匹配的形状:
# 假设X_train_sec_i原本是(32,)的1D数组 X_train_sec_i = X_train_sec_i.reshape(1, window, 1) # window=32,最终形状为(1,32,1)
2. 修复模型中的层连接错误
修改池化层的输入,让BatchNormalization层生效:
# 修正nat分支的池化层输入 nat_pooling_2 = tf.keras.layers.MaxPooling2D((2, 2), name="nat_pooling_2")(nat_batch_norm_2) # 修正act分支的池化层输入 act_pooling_2 = tf.keras.layers.MaxPooling2D((2, 2), name="act_pooling_2")(act_batch_norm_2)
3. 验证拼接维度
修正后,三个分支经过Flatten处理后,都会变成(batch_size, feature_count)的形状(batch_size统一为1),此时concatenate层就能正常拼接所有特征。
内容的提问来源于stack exchange,提问作者Cyrille
相关产品推荐
相关产品推荐

