gpt4 book ai didi

python - Pytorch不支持one-hot向量?

转载 作者:行者123 更新时间:2023-11-30 08:26:11 27 4
gpt4 key购买 nike

我对 Pytorch 如何处理 one-hot 向量感到非常困惑。在此tutorial ,神经网络将生成一个 one-hot 向量作为其输出。据我了解,教程中神经网络的示意结构应该是这样的:

enter image description here

但是,标签不是one-hot向量格式。我得到以下大小

print(labels.size())
print(outputs.size())

output>>> torch.Size([4])
output>>> torch.Size([4, 10])

奇迹般的是,我将输出标签传递给criterion=CrossEntropyLoss(),根本没有错误。

loss = criterion(outputs, labels) # How come it has no error?

我的假设:

也许 pytorch 会自动将标签转换为one-hot向量形式。因此,我尝试将标签转换为 one-hot 向量,然后再将其传递给损失函数。

def to_one_hot_vector(num_class, label):
b = np.zeros((label.shape[0], num_class))
b[np.arange(label.shape[0]), label] = 1

return b

labels_one_hot = to_one_hot_vector(10,labels)
labels_one_hot = torch.Tensor(labels_one_hot)
labels_one_hot = labels_one_hot.type(torch.LongTensor)

loss = criterion(outputs, labels_one_hot) # Now it gives me error

但是,我收到以下错误

RuntimeError: multi-target not supported at /opt/pytorch/pytorch/aten/src/THCUNN/generic/ClassNLLCriterion.cu:15

那么,Pytorch 不支持 one-hot 向量? Pytorch 如何计算两个张量 outputs = [1,0,0],[0,0,1]交叉熵以及标签 = [0,2] ?目前对我来说根本没有意义。

最佳答案

PyTorch 在其文档中声明 CrossEntropyLoss那个

This criterion expects a class index (0 to C-1) as the target for each value of a 1D tensor of size minibatch

换句话说,它在概念上将您的 to_one_hot_vector 函数内置于 CEL 中,并且不会公开 one-hot API。请注意,与存储类标签相比,one-hot 向量的内存效率较低。

如果您获得了 one-hot 向量并且需要转为类标签格式(例如与 CEL 兼容),您可以使用 argmax ,如下所示:

import torch

labels = torch.tensor([1, 2, 3, 5])
one_hot = torch.zeros(4, 6)
one_hot[torch.arange(4), labels] = 1

reverted = torch.argmax(one_hot, dim=1)
assert (labels == reverted).all().item()

关于python - Pytorch不支持one-hot向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55549843/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com