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

输出层多神经元场景下MSE损失如何计算?如何在Keras中提取单神经元损失?

问题解答

一、双输出场景下MSE损失的计算逻辑

默认配置下的MSE损失计算逻辑如下:

  • 对单个样本,先分别计算2个输出维度(实部、虚部)预测值和真实值的平方误差
  • 对单个样本的2个平方误差取平均,得到单样本损失
  • 对整个batch内所有样本的损失再取平均,得到当前batch的损失
  • 每轮epoch结束后,所有batch的损失平均值就是你在history对象中看到的单值总损失,本质是实部、虚部两个维度MSE的全局平均结果。

二、单输出维度损失的提取实现

完全可以实现,常用的有两种方案:

方案1:拆分输出层单独配置损失(推荐)

将原来的单输出层拆分为两个独立的命名输出分支,编译时分别指定损失,Keras会自动将两个维度的损失记录到history对象中,不需要额外逻辑。
示例代码:

from keras.layers import Input, Dense
from keras.models import Model

# 输入层,替换为你的实际输入维度
inputs = Input(shape=(input_dim,))
# 隐藏层
hidden = Dense(30, activation='relu')(inputs)
# 拆分两个输出层,分别命名方便后续损失匹配
real_out = Dense(1, name='real_part')(hidden)
imag_out = Dense(1, name='imag_part')(hidden)

# 定义多输出模型
model = Model(inputs=inputs, outputs=[real_out, imag_out])
# 编译时为每个输出指定MSE损失,总损失默认是两个分支损失的平均值,可通过loss_weights调整权重
model.compile(optimizer='adam', loss={'real_part': 'mse', 'imag_part': 'mse'})

# 训练时标签需要传入两个独立数组,分别对应实部、虚部的真实值
history = model.fit(x_train, [y_real_train, y_imag_train], epochs=epoch_num, batch_size=batch_size)

# 直接从history提取每轮的单维度损失
real_loss_per_epoch = history.history['real_part_loss']
imag_loss_per_epoch = history.history['imag_part_loss']
total_loss_per_epoch = history.history['loss']

方案2:自定义回调统计(不需要修改模型结构)

如果不想调整原有模型结构,可以自定义Keras回调函数,在每轮epoch结束后主动计算两个维度的损失并存入history。
示例代码:

from keras.callbacks import Callback

class PerOutputLossLogger(Callback):
    def on_epoch_end(self, epoch, logs=None):
        logs = logs or {}
        # 可替换为验证集x_val/y_val统计验证损失
        y_pred = self.model.predict(x_train, verbose=0)
        # 分别计算实部(第0维)、虚部(第1维)的MSE
        real_mse = ((y_train[:, 0] - y_pred[:, 0]) ** 2).mean()
        imag_mse = ((y_train[:, 1] - y_pred[:, 1]) ** 2).mean()
        # 存入logs后会自动同步到history对象
        logs['real_loss'] = real_mse
        logs['imag_loss'] = imag_mse

# 训练时传入自定义回调即可
history = model.fit(x_train, y_train, epochs=epoch_num, batch_size=batch_size, callbacks=[PerOutputLossLogger()])

# 提取每轮单维度损失
real_loss_per_epoch = history.history['real_loss']
imag_loss_per_epoch = history.history['imag_loss']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 12:24:02