【问题标题】:Why do the keras loss functions reduce the dimensionality by one?为什么keras损失函数会降维?
【发布时间】:2020-04-29 16:40:47
【问题描述】:

在计算 y_true 和 y_pred 之间的损失时,keras 损失函数将维度减少一维。例如,在批量大小 = 8 的 64x64 灰度图像对上训练网络时,y_true 和 y_pred 的形状将为 (8, 64, 64)。 keras 损失函数将产生一个形状为 (8, 64) 的损失张量,在最后一个维度上进行平均。 我不明白为什么这是必要的,它所做的只是平均图像行的损失。网络不需要为每个输出值单独计算损失(因此保存形状)吗?据我了解,反向传播着眼于与目标相比每个输出值的个体损失,然后相应地更新先前的权重。它怎么能做到这一点,只知道每行的平均损失,而不是单独的每个值?这是一个代码 sn-p,它显示了我描述的行为:

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)

【问题讨论】:

  • 最后一个维度用于计算损失本身。在您的情况下,对于与最后一个维度对应的元素,计算 mean_absolute_error
  • 我不确定我是否理解,我仍然是机器学习的初学者,所以解释可能很明显。 “对应于最后一个维度的元素”是什么意思?为什么这些元素的处理方式与倒数第二个维度对应的元素不同,即使它们几乎可以互换?
  • 举个例子,假设你有一个维度向量,比如(10, 5, 2),你想总结一下。现在通常库会询问您哪个轴,但假设默认情况下它采用最后一个轴。然后在 3d 矩阵中,沿第三维对项目求和,得到的矩阵只有 2d 维。再次求和,你得到一个长度为 10 的列向量。希望这个例子很清楚
  • 这是有道理的,但我仍然不明白为什么这是必要的。它总结了最后一维的损失,代表图像的列。为什么需要总结呢?它不需要每个输出值的特定损失吗?
  • 考虑两个列向量。要计算 mean_absolute_error,您需要对向量之间的绝对差求和,然后除以每个向量中的元素数。结果你得到的只是一个数字,也就是说你已经从 1d 变成了 0d。损失函数中的这种求和操作导致维度减少。如果这对您有意义,请告诉我

标签: python tensorflow keras loss-function


【解决方案1】:

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

您可以通过向数据添加虚拟轴来避免这种情况。

这就是我到达那里的方式:

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

"(注意ondN-1:所有损失函数都减少1维,通常axis=-1。)" 此外:“损失类实例具有缩减构造函数参数,默认为“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 仅表示类包装器没有应用额外的减少。对于具有示例输入形状 [batch, W, H, n_classes] 的分类损失,减少了 n_classes 维度。对于逐点损失,您必须包含一个虚拟轴,以便 [batch, W , H, 1] 减少为 [batch, W, H]。没有虚拟轴 [batch, W, H] 将错误地减少为 [batch, W]。"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 2020-11-04
    • 2020-06-06
    • 2019-04-05
    • 2019-09-06
    • 2018-07-22
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多