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

多输入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:31:15