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

单输出Keras模型输入多输出数据时的行为探究

Keras单输出模型适配多列目标数据的原因解析

问题场景复现

1. 构建单输出模型

import tensorflow as tf
import numpy as np

model = tf.keras.Sequential()

model.add(tf.keras.layers.Dense(units=1))  # 仅设置单个输出神经元
model.compile(optimizer='adam', loss='mae')

2. 使用多列目标数据训练

x_data = np.random.rand(1000, 5)
y_data = np.random.rand(1000, 3)  # 目标数据包含3列特征

model.fit(x=x_data, y=y_data, epochs=1)  # 代码可正常执行无报错

3. 损失值验证结果

e0 = model.evaluate(x_data, y_data[:,0])
e1 = model.evaluate(x_data, y_data[:,1])
e2 = model.evaluate(x_data, y_data[:,2])

eA = model.evaluate(x_data, y_data)

average = (e0+e1+e2)/3
print(average)
print(eA) # 两者数值基本一致

执行输出:

32/32 [==============================] - 0s 2ms/step - loss: 0.4504
32/32 [==============================] - 0s 2ms/step - loss: 0.4590
32/32 [==============================] - 0s 2ms/step - loss: 0.4642
32/32 [==============================] - 0s 3ms/step - loss: 0.4579
0.45786773165067035 #<- (e0+e1+e2)/3
0.45786771178245544 #<- eA

疑问解答

1. 模型是否以y_data列平均值为目标拟合?

不是。实际计算逻辑是:模型的单输出结果会与y_data的每一列分别计算MAE损失,再将所有列的损失值取平均,作为最终损失参与反向传播。模型权重更新基于这个平均损失,而非拟合y_data的列均值。

2. 为何未抛出维度不匹配错误?

Keras设计时允许目标张量与输出张量在最后一维维度不同时,通过广播机制自动匹配计算损失,目的是为多任务训练等场景提供灵活性。但这种设计确实可能掩盖用户的数据输入错误。如果需要严格校验维度匹配,可以在训练前手动添加断言:

assert y_data.shape[-1] == model.output.shape[-1], "目标数据维度与模型输出维度不匹配"

以此避免误输入数据的问题。

内容的提问来源于stack exchange,提问作者Mas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:31:04