卷积后添加Input Layer导致Keras计算图断开问题求助
问题原因与修复方案
核心错误原因
代码中定义了两个输入层input_layer和input_layer_2,但构建Model时仅传入input_layer作为输入,而input_layer_2在网络中间的拼接层中被使用,导致模型计算图断开——Keras无法找到input_layer_2的输入来源。此外还有一行冗余代码:x = concatenate([d1, input_layer_2])的结果未被后续层使用,属于无效计算。
修复后的完整代码
from tensorflow.keras import Sequential from tensorflow.keras.layers import Embedding from tensorflow.keras.layers import Dense,Input,Conv1D,MaxPool1D,Activation,Dropout,Flatten from tensorflow.keras.models import Model from tensorflow.keras import applications from tensorflow.keras.layers import concatenate import tensorflow as tf tf.keras.backend.clear_session() from keras.regularizers import l2 from tensorflow.keras import backend as K # 需提前定义的参数示例,根据实际场景替换 max_length = 1000 vocab_size = 10000 embedding_matrix = tf.random.normal((vocab_size, 100)) input_layer = Input(shape=(max_length,) ) input_layer_2 = Input(shape=(7,) ) x = Embedding(vocab_size, output_dim=100,weights=[embedding_matrix],input_length=max_length, trainable=False)(input_layer) c1 = Conv1D(filters=13, kernel_size=2, padding='same', activation='relu',kernel_initializer="glorot_normal")(x) c2 = Conv1D(filters=13, kernel_size=2, padding='same', activation='relu',kernel_initializer="glorot_normal")(x) c3 = Conv1D(filters=13, kernel_size=2, padding='same', activation='relu',kernel_initializer="glorot_normal")(x) x = concatenate([c1, c2, c3], axis=1) m1 = MaxPool1D(pool_size=2)(x) c1 = Conv1D(filters=12, kernel_size=2, padding='same', activation='relu',kernel_initializer="glorot_uniform")(m1) c2 = Conv1D(filters=12, kernel_size=2, padding='same', activation='relu',kernel_initializer="he_uniform")(m1) c3 = Conv1D(filters=12, kernel_size=2, padding='same', activation='relu',kernel_initializer="glorot_uniform")(m1) x = concatenate([c1, c2, c3], axis=1) m2 = MaxPool1D(pool_size=2)(x) c4 = Conv1D(filters=15, kernel_size=2, padding='same', activation='relu',kernel_initializer="glorot_uniform")(m2) flat1 = Flatten()(c4) # 合并卷积分支与第二个输入 x = concatenate([flat1, input_layer_2], axis=1) d1 = Dense(64, activation="relu",kernel_initializer="glorot_uniform")(x) d1 = Dense(32, activation="relu",kernel_initializer="glorot_uniform")(d1) # 移除未使用的冗余拼接操作 out = Dense(3, activation="softmax",kernel_initializer="glorot_uniform")(d1) # 关键修改:将两个输入层都传入模型的inputs参数 model = Model(inputs=[input_layer, input_layer_2], outputs=out) print(model.summary())
关键修改点
- 模型输入配置:将
Model的inputs参数从input_layer改为[input_layer, input_layer_2],让Keras识别到两个输入均属于模型的计算图节点。 - 清理冗余代码:删除未被后续层使用的
x = concatenate([d1, input_layer_2])行,减少无效计算逻辑。
内容的提问来源于stack exchange,提问作者Chandan Malla
相关产品推荐
相关产品推荐

