喀拉拉邦和投入和损失的形状

时间:2019-11-30 15:55:12

标签: keras

在所有用于keras的代码示例中,我看到输入形状是直接传递的,并且可以推测批处理大小是第一个,例如:

model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# now the model will take as input arrays of shape (*, 16)
# and output arrays of shape (*, 32)

但是,关于自定义损失,我看到使用了最后一个轴(axis = -1)。

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

在写损失时,应该将y_true和y_pred视为批次还是奇异样本? 我假设它是前者,但是如果是这样,我不明白为什么要指定最后一个轴

1 个答案:

答案 0 :(得分:0)

在自定义损失函数中,将y_truey_pred视为批处理,函数的返回值也是如此。如果只为您的网络计算一个损耗,那么您也可以摆脱指定的轴,因为最终只需要一个损耗值即可。
但是,如果您的网络中有多个输出,并且要计算总损耗(每个输出可能使用其自己的损耗函数),情况就会开始发生变化。

请签出:https://github.com/keras-team/keras/blob/master/keras/engine/training.py#L658
用于计算总损失_prepare_total_loss的函数。
在此函数中,执行以下代码:

output_loss = loss_fn(y_true, y_pred, sample_weight=sample_weight)

返回网络单个输出的损耗。这也是您的自定义损失函数被调用的地方。如果有多个输出,则将全部输出计算,加权并加到总损失中:total_loss += loss_weight * output_loss

最后,_prepare_total_loss返回K.mean(total_loss)。因此,在最简单的情况下,如果您的自定义损失函数返回的向量的长度等于批处理大小,并且您的网络中只有一个输出出现损失,则最终损失将是您的返回向量的平均值海关损失。
但是,在有多个输出和多个损失的情况下,您首先要为每个输出计算批次的损失矢量,从而计算损失函数,取其加权和,然后通过对所得向量的平均值进行计算来计算最终损失。 /> 如果您的损失函数将分别返回单个损失值而不是批次大小的向量,则最终损失将是多个平均损失值的均值,该平均值不同于整个批次的平均损失。