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

如何用Keras函数式API正确设置多输出神经网络的损失函数?

问题分析与解决

核心错误原因

你遇到的ValueError本质是训练数据的标签结构和模型输出结构不匹配:

  • 模型定义了2个输出分支:y_q_layer(对应3个连续变量)、y_t_layer(对应1个分类变量),总输出结构长度为2
  • 但你喂给模型的标签是4个独立变量(1分类+3连续),结构长度为4,两者无法对齐

另外代码里还有一处关键错误:分类输出层的单元数设置错误——你的分类变量有3种可能输出,但y_t_layer的units=1,这会导致softmax输出无效,也会干扰损失计算。

修复步骤

1. 修正分类输出层

把分类输出层的单元数改成3,对应3个类别:

# 原代码错误:units=1
y_t_layer = Dense(units=3, activation='softmax', name='y_t_layer')(x)

2. 调整训练数据的标签结构

训练时,你需要把标签整理成两个元素的列表/字典,和模型输出分支严格对应:

  • 列表形式:标签为[连续变量数组, 分类标签数组]
    • 连续变量数组形状:(样本数, 3)
    • 分类标签数组形状:(样本数,)(因为用了sparse_categorical_crossentropy,无需对分类标签做one-hot编码)
  • 字典形式:标签为{'y_q_layer': 连续变量数组, 'y_t_layer': 分类标签数组}

举个训练数据准备的示例:

# 假设原始标签存储在DataFrame中,col1是分类变量,col2-col4是连续变量
y_class = df['col1'].values  # 形状(样本数,)
y_continuous = df[['col2', 'col3', 'col4']].values  # 形状(样本数,3)

# 训练时传入整理好的标签
model.fit(X_train, [y_continuous, y_class], epochs=10, batch_size=32)
# 或用字典形式更清晰
model.fit(X_train, {'y_q_layer': y_continuous, 'y_t_layer': y_class}, epochs=10, batch_size=32)

3. 验证模型输出结构

可以打印模型结构确认输出分支的形状是否正确:

model.summary()

正常情况下,y_t_layer的输出形状应为(None, 3),y_q_layer的输出形状应为(None, 3)。

完整修正后的代码示例

import tensorflow as tf
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model

inputs = tf.keras.layers.Input(shape=(37,))

# 共享基础层
x = Dense(units=74, activation='relu')(inputs)
x = Dense(units=74, activation='relu')(x)

# 分类输出层:3个单元对应3种类别
y_t_layer = Dense(units=3, activation='softmax', name='y_t_layer')(x)

# 连续变量分支
quality_layer = Dense(units=148, name='quality_layer', activation='relu')(x)
y_q_layer = Dense(units=3, name='y_q_layer')(quality_layer)

# 定义模型
model = Model(inputs=inputs, outputs=[y_q_layer, y_t_layer])

optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.0001)

model.compile(optimizer=optimizer, 
              loss={'y_t_layer': 'sparse_categorical_crossentropy', 
                    'y_q_layer': 'mse'},
              metrics={'y_t_layer': 'accuracy', 
                       'y_q_layer': tf.keras.metrics.RootMeanSquaredError()}
             )

# 假设X_train是输入特征,y_continuous、y_class是整理好的标签
# model.fit(X_train, [y_continuous, y_class], epochs=10, batch_size=32)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:25:28