【发布时间】: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