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

多任务神经网络中Model.evaluate()返回浮点数而非列表的问题

Keras多任务模型evaluate返回单标量的解决方案

问题背景

搭建多任务神经网络时,调用Model.evaluate()期望得到各任务损失的列表,但实际返回单一标量,model.metrics_names仅显示'loss'。原复现代码如下:

import numpy as np
from keras.layers import Input, Dense
from keras.models import Model

X = np.random.random((10, 10))
y = {'pi': np.random.random((10,)), 'u':  np.random.random((10,))}

in_layer = Input(shape=X.shape[1:])
out1 = Dense(1, name='pi')(in_layer)
out2 = Dense(1, name='u')(in_layer)
model = Model(inputs=in_layer, outputs=[out1,out2])
model.compile(loss={'pi': 'mean_squared_error', 'u': 'mean_squared_error'}, optimizer = 'adam')

model.fit(X,y)
print(model.evaluate(X, y)) # 返回单一浮点数
print(model.metrics_names) # ['loss']

解决方法

方法1:使用return_dict=True参数(推荐,适用于TensorFlow 2.x/Keras 2.0.9+)

调用evaluate()时添加return_dict=True,会返回包含总损失和各任务单独损失的字典:

results = model.evaluate(X, y, return_dict=True)
print(results)
# 输出示例:{'loss': 0.215, 'pi_loss': 0.098, 'u_loss': 0.117}

此时可直接通过键名获取对应任务的损失值,比如results['pi_loss']。

方法2:显式将各任务损失设为指标(兼容旧版本)

在compile()时,为每个输出添加对应的损失作为指标:

model.compile(
    loss={'pi': 'mean_squared_error', 'u': 'mean_squared_error'},
    optimizer='adam',
    metrics={'pi': ['mean_squared_error'], 'u': ['mean_squared_error']}
)

此时调用evaluate()会返回列表,顺序对应model.metrics_names的结果:

loss_values = model.evaluate(X, y)
print(model.metrics_names) # ['loss', 'pi_mean_squared_error', 'u_mean_squared_error']
print(loss_values) # [总损失, pi任务损失, u任务损失]

核心原因

默认情况下,Keras仅计算并返回所有任务损失的加权总和(默认权重为1),不会自动跟踪每个任务的单独损失。只有显式指定需要输出这些损失(通过指标或return_dict参数),才能获取到各任务的具体损失值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:05:14