繁体   English   中英

Keras 模型的每个(最后一层)输出的单独损失

[英]Individual loss of each (final-layer) output of Keras model

在训练 ANN 进行回归时,Keras 将训练/验证损失存储在History 对象中 在具有标准损失函数的最后一层多个输出的情况下,即均方误差或 MSE:

  • 在多输出场景中损失代表什么? 它是所有输出的单个损失的平均值还是其他东西?
  • 我可以在不实现自定义损失函数的情况下以某种方式单独访问每个输出的损失吗?

任何提示将不胜感激。

编辑 - - - - - -

model = Sequential()
model.add(LSTM(10, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(2))
model.compile(loss='mse', optimizer='adam')

添加片段后重新表述我的问题:

在输出层有两个神经元的情况下如何计算损失,由此产生的损失代表什么? 它是两个输出的平均损失吗?

标准 MSE 损失在 Keras 中实现如下:

def mse_loss(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

如果您现在在输出层有多个神经元,则计算出的损失将只是所有单个神经元的平方损失的平均值。

如果您希望跟踪每个单独输出的损失,您必须为此编写一个自己的指标。 如果你想让它尽可能简单,你可以使用以下指标(它必须嵌套,因为 Keras 只允许一个指标具有输入 y_true 和 y_pred):

def inner_part_custom_metric(y_true, y_pred, i):
    d = y_pred-y_true
    square_d = K.square(d)
    return square_d[:,i] #y has shape [batch_size, output_dim]

def custom_metric_output_i(i):
    def custom_metric_i(y_true, y_pred):
        return inner_part_custom_metric(y_true, y_pred, i)
    return custom_metric_i

现在,假设您有 2 个输出神经元。 创建此指标的 2 个实例:

metrics = [custom_metric_output_i(0), custom_metric_output_i(1)]

然后按如下方式编译您的模型:

model = ...
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.01), metrics=metrics)
history = model.fit(...)

现在您可以访问历史对象中每个单独神经元的损失。 使用以下命令查看历史对象中的内容:

print(history.history.keys())
print(history.history.keys())

进而:

print(history.history['custom_metric_i'])

如前所述,实际上只会打印一个维度的历史!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM