像素损失
Loss over pixels
在反向传播过程中,这些情况会不会有不同的效果:-
- 总结所有像素的损失然后反向传播。
- 所有像素的平均损失然后反向传播
- 在所有像素上单独反向传播。
我主要怀疑的是数值,但所有这些都会产生影响。
no 1 和 2 之间的区别基本上是:由于 sum
将导致大于 mean
,sum
操作的梯度幅度将更大,但方向将一样。
这里稍微演示一下,先声明必要的变量:
x = torch.tensor([4,1,3,7],dtype=torch.float32,requires_grad=True)
target = torch.tensor([4,2,5,4],dtype=torch.float32)
现在让我们使用 L2
损失和 sum
:
计算 x
的梯度
loss = ((x-target)**2).sum()
loss.backward()
print(x.grad)
这输出:tensor([ 0., -2., -4., 6.])
现在使用 mean
:(重置 x
毕业后)
loss = ((x-target)**2).mean()
loss.backward()
print(x.grad)
这输出:tensor([ 0.0000, -0.5000, -1.0000, 1.5000])
注意后面的梯度是 sum
的 1/4,这是因为这里的张量包含 4 个元素。
关于第三个选项,如果我没有理解错的话,那是不可能的。在使用 sum
、mean
或其他任何方式将单个像素错误聚合为标量之前,您不能进行反向传播。
在反向传播过程中,这些情况会不会有不同的效果:-
- 总结所有像素的损失然后反向传播。
- 所有像素的平均损失然后反向传播
- 在所有像素上单独反向传播。
我主要怀疑的是数值,但所有这些都会产生影响。
no 1 和 2 之间的区别基本上是:由于 sum
将导致大于 mean
,sum
操作的梯度幅度将更大,但方向将一样。
这里稍微演示一下,先声明必要的变量:
x = torch.tensor([4,1,3,7],dtype=torch.float32,requires_grad=True)
target = torch.tensor([4,2,5,4],dtype=torch.float32)
现在让我们使用 L2
损失和 sum
:
x
的梯度
loss = ((x-target)**2).sum()
loss.backward()
print(x.grad)
这输出:tensor([ 0., -2., -4., 6.])
现在使用 mean
:(重置 x
毕业后)
loss = ((x-target)**2).mean()
loss.backward()
print(x.grad)
这输出:tensor([ 0.0000, -0.5000, -1.0000, 1.5000])
注意后面的梯度是 sum
的 1/4,这是因为这里的张量包含 4 个元素。
关于第三个选项,如果我没有理解错的话,那是不可能的。在使用 sum
、mean
或其他任何方式将单个像素错误聚合为标量之前,您不能进行反向传播。