为什么keras损失函数会将维度降低一



当计算y_true和y_pred之间的损失时,keras损失函数将维数降低一。例如,当在批处理大小为8的64x64灰度图像对上训练网络时,y_true和y_pred的形状将是(8,64,64(。keras损失函数将产生形状为(8,64(的损失张量,在最后一个维度上进行平均。我不明白为什么这是必要的,它所做的只是平均图像各行的损失。难道网络不需要为每个输出值单独计算损失(从而保持形状(吗?据我所知,反向传播会查看与目标相比每个输出值的单独损失,然后相应地更新以前的权重。它怎么能做到这一点,只知道每一行的平均损失,而不是每个值的单独损失?下面是一个代码片段,显示了我所描述的行为:

y_true = K.random_uniform([8,64,64])
y_pred = K.random_uniform([8,64,64])
c= mean_absolute_error(y_true,y_pred)
print(K.eval(tf.shape(c)))  # (8,64)

我也有同样的想法。我相信,Keras假设您的数据具有以下维度:[batch,W,H,n_classes],这意味着在轴上取平均值=-1意味着在所有不同类别上取平均损失。然而,在您的情况下,您没有该维度,因为您可能在灰度图像中进行二进制分类。因此,它最终会对行/列的损失进行平均。有趣的是,这个模型仍然可以像这样训练,甚至提高性能,这让我相信,处于类似情况的人往往只是训练他们的模型而没有注意到。

您可以通过在数据中添加一个伪轴来避免这种情况。

我就是这样到达那里的:

发件人:https://keras.io/api/losses/

"(注:N-1:所有损失函数减少1维,通常轴=-1。("此外:";loss类实例具有一个reduction构造函数参数,该参数默认为";sum_over_batch_size";(即平均值(。允许值是";sum_over_batch_size"sum";,以及";none":•";sum_over_batch_size";意味着损失实例将返回批次中每个样本损失的平均值。•";sum";意味着损失实例将返回批次中每个样本损失的总和。•";none";意味着损失实例将返回每个样本损失的完整数组">

发件人https://www.tensorflow.org/api_docs/python/tf/keras/losses/Reduction

"注意:使用Reduction.NONE时,请验证输出的形状。由损失类包装的内置损失函数会减少一个维度(轴=-1,或轴,如果损失函数指定(。Reduction.NONE只是意味着类包装器没有应用额外的减少。对于示例输入形状为[批,W,H,n_classes]的分类损失,n_classies维度被减小。对于逐点损耗,必须包含一个伪轴,以便将[批,W,H,1]减少为[批,W,H]。如果没有伪轴[批次,W,H],则会错误地减少为[批次,W]">

最新更新