pytorch
shape_error
ai_generated
true
RuntimeError: 1D target tensor expected, multi-target not supported
ID: pytorch/invalid-argument-2d-index-target
90%Fix Rate
88%Confidence
1Evidence
2023-08-20First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| pytorch>=1.13.0 | active | — | — | — |
Root Cause
A loss function like CrossEntropyLoss received a target tensor with more than one dimension (e.g., one-hot encoded labels) instead of a 1D tensor of class indices.
generic中文
损失函数(如 CrossEntropyLoss)接收到的目标张量维度超过一维(例如独热编码标签),而非一维类别索引张量。
Official Documentation
https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.htmlWorkarounds
-
95% success Convert one-hot encoded labels to class indices using `torch.argmax(target, dim=1)` before passing to the loss function. Example: `loss = criterion(output, target.argmax(dim=1))`
Convert one-hot encoded labels to class indices using `torch.argmax(target, dim=1)` before passing to the loss function. Example: `loss = criterion(output, target.argmax(dim=1))`
-
90% success If the target is already 1D but has an extra dimension from batching, squeeze it: `target = target.squeeze()`.
If the target is already 1D but has an extra dimension from batching, squeeze it: `target = target.squeeze()`.
-
85% success Use `torch.nn.BCEWithLogitsLoss` with proper target shape (same as output) if the task is multi-label classification.
Use `torch.nn.BCEWithLogitsLoss` with proper target shape (same as output) if the task is multi-label classification.
中文步骤
在传递给损失函数之前,使用 `torch.argmax(target, dim=1)` 将独热编码标签转换为类别索引。示例:`loss = criterion(output, target.argmax(dim=1))`
如果目标已经是 1D 但由于批处理有额外维度,则挤压它:`target = target.squeeze()`。
如果任务是多标签分类,则使用 `torch.nn.BCEWithLogitsLoss` 并具有正确的目标形状(与输出相同)。
Dead Ends
Common approaches that don't work:
-
95% fail
This still produces a 2D tensor; the loss expects 1D indices.
-
90% fail
The error is about dimensionality, not dtype; CrossEntropyLoss expects Long type indices.
-
80% fail
BCEWithLogitsLoss expects a different shape and value range; it will not fix the dimensionality issue.