Keras模型的每个(最终层)输出的个体损失

时间:2018-08-30 12:57:50

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

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

添加摘录后重新表达我的问题:

  

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

print(history.history.keys())

然后:

print(history.history['custom_metric_i'])
如前所述,

实际上只会打印一维的历史记录!