多输入Keras汽车价格预测模型构建问题求助
解决汽车价值预测器的多输入模型构建问题
嘿,我来帮你理清楚问题所在~
你最初代码的核心问题
- Sequential模型不适合多输入分支场景:Sequential是为单输入、单输出的线性层堆叠设计的,你把四个不同输入维度的Dense层直接放在Sequential里,模型根本无法正确识别这是四个独立的输入,反而会把它们当成连续的层,导致输入形状完全不匹配,输出自然不符合预期。
- 输入数据传递错误:Sequential模型不支持字典形式的多输入,它只能接收单一张量,所以你用
x = {'date': ..., 'km': ...}这种方式喂数据,模型根本无法正确解析。
你第二个版本的问题(接近但仍不对)
你在定义分支的时候犯了一个关键错误:每次都用新的输入覆盖了同一个变量dense_1,比如:
dense_1 = Dense(256, activation='relu')(input_1) dense_1 = Dense(256, activation='relu')(input_2) # 这里直接覆盖了input_1的处理结果 dense_1 = Dense(256, activation='relu')(input_3) # 又覆盖了input_2的结果 dense_1 = Dense(256, activation='relu')(input_4) # 最后只剩input_4的处理结果
这就导致前三个输入(date、km、consume)的处理结果完全被丢弃,模型只用到了type输入,这显然不是你想要的多输入融合效果。
正确的多输入模型实现(匹配你想要的结构)
按照你提到的图示逻辑,应该为每个输入创建独立的分支,处理后再合并所有分支的输出,然后走共同的全连接层。代码如下:
from tensorflow.keras.layers import Input, Dense, Dropout, Concatenate from tensorflow.keras.models import Model # 1. 定义每个输入层 input_date = Input(shape=(1,), name='date') input_km = Input(shape=(1,), name='km') input_consume = Input(shape=(10,), name='consume') input_type = Input(shape=(440,), name='type') # 2. 为每个输入创建独立的分支处理(可根据需求调整神经元数,车型维度高可以用更多神经元) branch_date = Dense(128, activation='relu')(input_date) branch_km = Dense(128, activation='relu')(input_km) branch_consume = Dense(128, activation='relu')(input_consume) branch_type = Dense(256, activation='relu')(input_type) # 3. 合并所有分支的输出 merged = Concatenate()([branch_date, branch_km, branch_consume, branch_type]) # 4. 共同的全连接层和Dropout x = Dropout(0.5)(merged) x = Dense(256, activation='relu')(x) x = Dropout(0.5)(x) # 5. 输出层(预测价格用线性激活) output_price = Dense(1, activation='linear')(x) # 6. 构建模型 model = Model(inputs=[input_date, input_km, input_consume, input_type], outputs=output_price) # 编译模型 model.compile(loss='mse', optimizer='adam')
训练时的数据传递
训练的时候,你可以用两种方式传递输入数据:
列表形式(简洁直观)
model.fit( x=[samples_train['input'][:,0], samples_train['input'][:,1], samples_train['input'][:,2], samples_train['input'][:,3]], y=samples_train['output'], epochs=1000, batch_size=16, verbose=1, validation_data=( [samples_valid['input'][:,0], samples_valid['input'][:,1], samples_valid['input'][:,2], samples_valid['input'][:,3]], samples_valid['output'] ), callbacks=callbacks )
字典形式(对应输入层名称,可读性更强)
model.fit( x={ 'date': samples_train['input'][:,0], 'km': samples_train['input'][:,1], 'consume': samples_train['input'][:,2], 'type': samples_train['input'][:,3] }, y=samples_train['output'], epochs=1000, batch_size=16, verbose=1, validation_data=( { 'date': samples_valid['input'][:,0], 'km': samples_valid['input'][:,1], 'consume': samples_valid['input'][:,2], 'type': samples_valid['input'][:,3] }, samples_valid['output'] ), callbacks=callbacks )
这样就能实现你想要的多输入分支+融合的模型结构,每个输入都会被独立处理后再合并,完全符合你提到的图示逻辑。
内容的提问来源于stack exchange,提问作者ajlaj25
相关产品推荐
相关产品推荐

