python - Pytorch 计算堆叠张量的单独损失
问题描述
我有一个(N, k, 1)
由堆叠网络的标量预测产生的张量k
。N
是批量大小。
所有预测的目标都是相同的,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()
有没有更有效的方法来实现同样的目标?
解决方案
是的,谢天谢地,您可以通过广播轻松地在 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 个张量时,内部深处将被广播以匹配的形状,这就是您无需重复自己的原因。t
t
(N,1,1)
stacked_predictions
(N,k,1)
nn.MSELoss()
t
stacked_predictions
t
请注意,我添加了乘以k
,那是因为您想要总和而不是维度 1(具有 size 的那个)的平均值k
。如果您想要所有预测的平均值,请省略乘法。
推荐阅读
- graphql - 错误消息:更新 GraphQL 架构时实例数据无效
- firebase - 有没有办法从 firebase -> bigquery 导出数据更改归因模型?
- dependency-injection - NestJs:动态创建类的实例
- kibana - 如何对度量可视化的拆分组进行排序?
- firebase - Firebase 动态链接如何决定返回社交元数据而不是重定向流
- json - 如何在本地文件系统中将嵌套的 Dart 模型(和列表)保存为 JSON
- google-apps-script - 从 Google 表格复制到 Google 文档,无需更改格式
- php - 邮箱收到时如何隐藏回复标题?
- mysql - MySQL:在后台查询中使用索引
- web-applications -
web.config 中的标签使网站正常运行。没有它,它运行非常缓慢