输出层多神经元场景下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
相关产品推荐
相关产品推荐

