首页 > 解决方案 > Pytorch 计算堆叠张量的单独损失

问题描述

我有一个(N, k, 1)由堆叠网络的标量预测产生的张量kN是批量大小。

所有预测的目标都是相同的,t。如何有效地计算损失(例如 MSE)?我现在正在做的是拆分每个网络的预测并将单独的损失相加。


stacked_predictions  # (N, k, 1) tensor with the predictions
t  # common target

predictions = [prediction[:, i] for i in range(stacked_predictions.size()[1])]
loss = sum(self.loss(prediciton, t) for prediction in predictions)

optimizer.zero_grad()
loss.backward()
optimizer.step()

有没有更有效的方法来实现同样的目标?

标签: pythonmachine-learningtorch

解决方案


是的,谢天谢地,您可以通过广播轻松地在 python 中做到这一点:假设:

N=100 #For example
k=10 #For example
stacked_predictions = torch.randn(N, k, 1)  # (N, k, 1) tensor with the predictions
t = torch.randn(N,1)  # common target

然后,您可以获得 的有效等效计算loss

loss = k * nn.MSELoss()(stacked_predictions, t[:, None, :])

(在您的情况下将 nn.MSELoss() 替换为self.loss)。请注意,在中间t[:, None, :]添加了另一个单例维度,因此在is of shape时变为shape 。当您调用这 2 个张量时,内部深处将被广播以匹配的形状,这就是您无需重复自己的原因。tt(N,1,1)stacked_predictions(N,k,1)nn.MSELoss()tstacked_predictionst

请注意,我添加了乘以k,那是因为您想要总和而不是维度 1(具有 size 的那个)的平均值k。如果您想要所有预测的平均值,请省略乘法。


推荐阅读