Pytorch nn.CrossEntropyLoss给出,ValueError:预期目标大小(x,y),获得3d张量的torch.Size([x,z])

时间:2020-10-30 21:26:31

标签: python pytorch

我遵循示例here,其中文档显示:

输入:(N,C),其中C =类数

目标:(N),其中每个值为0≤目标[i]≤C-1

在为2d张量给出的示例中就是这种情况

Shipment job = Shipment.Builder.newInstance(...)
VehicleRoute.Builder route = VehicleRoute.Builder.newInstance(...)
route.addPickup(job);
route.addDelivery(job);

但是对于二维张量,我遇到了错误

loss = nn.CrossEntropyLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.empty(3, dtype=torch.long).random_(5)
output = loss(input, target)
output.backward()
import torch.nn as nn
import torch
loss = nn.CrossEntropyLoss(ignore_index=0)

inputs = torch.rand(32, 128, 3)
targets = torch.ones(32, 128)

loss(inputs, targets.long())

据我所知,我在设置尺寸方面做得很好。错误消息似乎认为我正在提供2d向量,但是我给它提供了3d向量,缺少128尺寸。

此损失功能是否存在我未正确设置的内容?

1 个答案:

答案 0 :(得分:1)

这是文档中有关K维损耗的内容:

还可通过提供大小≥K≥1的大小(minibatch,C,d_1,d_2,...,d_K)输入来用于更高维度的输入(例如2D图像),其中K是维度数,以及形状合适的目标(见下文)。

如果您有3个类,则正确的输入应为TfLiteTensorCopyFromBuffer(inputTensor, imageDataBuffer, imageSize * sizeof(float));形状:

<i id="arrowIcon" class="fa fa-car fa-spin" onclick="this.classList.remove('fa-spin')"></i>

如果您有128个类别,则目标应为(32, 3, 128)形状:

import torch.nn as nn
import torch
loss = nn.CrossEntropyLoss(ignore_index=0)

inputs = torch.rand(32, 3, 128)
targets = torch.ones(32, 128)

loss(inputs, targets.long())