【问题标题】:Individual loss of each (final-layer) output of Keras modelKeras 模型的每个(最后一层)输出的单独损失
【发布时间】:2019-02-05 10:31:08
【问题描述】:

在训练 ANN 进行回归时,Keras 将训练/验证损失存储在 History object 中。在最后一层有多个输出的情况下,standard loss function,即均方误差或 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')

添加 sn-p 后重新表述我的问题:

在输出层有两个神经元的情况下,损失是如何计算的,得到的损失代表什么?这是两个输出的平均损失吗?

【问题讨论】:

  • 你能举个例子吗? “最后一层有多个输出”是什么意思?
  • 感谢您的评论,我添加了示例代码:)
  • 对我来说,我只看到一个输出,就是dense layer的输出。您是指批次中每个样品的损失吗?
  • 有两个输出,因为密集层中有两个单元。我的问题是如何将损失计算为给定 vector 输出的 scalar

标签: python neural-network keras loss-function loss


【解决方案1】:

标准的 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())

【讨论】:

    【解决方案2】:
    print(history.history.keys())
    

    然后:

    print(history.history['custom_metric_i'])
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2019-01-10
      • 2020-02-29
      • 1970-01-01
      • 2019-03-18
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多