Python Pytorch计算叠加张量的分离损失
我有一个Python Pytorch计算叠加张量的分离损失,python,machine-learning,torch,Python,Machine Learning,Torch,我有一个(N,k,1)张量,由k网络的叠加标量预测得到N是批次大小 所有预测的目标都相同,t。如何有效地计算损失(如MSE)?我现在所做的是对每个网络的预测进行拆分,并将单独的损失相加 带预测的叠加(N,k,1)张量 t#共同目标 预测=[范围内i的预测[:,i](堆叠的_预测.size()[1])] 损失=总和(预测中预测的自身损失(预测,t) optimizer.zero_grad() loss.backward() optimizer.step() 有没有更有效的方法来实现这一点?是的
(N,k,1)
张量,由k
网络的叠加标量预测得到N
是批次大小
所有预测的目标都相同,t
。如何有效地计算损失(如MSE)?我现在所做的是对每个网络的预测进行拆分,并将单独的损失相加
带预测的叠加(N,k,1)张量
t#共同目标
预测=[范围内i的预测[:,i](堆叠的_预测.size()[1])]
损失=总和(预测中预测的自身损失(预测,t)
optimizer.zero_grad()
loss.backward()
optimizer.step()
有没有更有效的方法来实现这一点?是的,幸好您可以通过广播轻松地用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 = k * nn.MSELoss()(stacked_predictions, t[:, None, :])
(在您的情况下,将nn.MSELoss()替换为self.loss
)。
请注意,t[:,None,:]
在中间的t
中添加了另一个单体维度,因此t
变成了形状(N,1,1)
,而堆叠的
是形状(N,k,1)
。当您在这两个张量上调用nn.MSELoss()
时,将广播深层的t
,以匹配堆叠的预测
的形状,这就省去了您自己重复t
的需要
请注意,我添加了乘k
,这是因为您想要的是维度1上的和,而不是平均值(大小为k
)。如果你想得到所有预测的平均值,请省略乘法。非常感谢!我的荣幸,费德里科:)