多任务神经网络中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
相关产品推荐
相关产品推荐

