【问题标题】:How do I use one-hot encoding with cross-entropy loss?如何使用带有交叉熵损失的 one-hot 编码?
【发布时间】:2020-08-26 14:46:27
【问题描述】:

我已经尝试使用一个热编码来使用狗品种数据集对大约 120 个类别的多类别分类。也使用 resnet18。但是当我运行代码时会显示以下错误。请帮我解决问题。

我的模型代码如下所示:

model = torchvision.models.resnet18()
op = torch.optim.Adam(model.parameters(),lr=0.001)
crit = nn.NLLLoss()
model.fc = nn.Sequential(
    nn.Linear(512,120),
    nn.Dropout(inplace=True),
    nn.ReLU(),
    nn.LogSoftmax())

for i,(x,y) in enumerate(train_dl):
    # prepare one-hot vector
    y_oh=torch.zeors(y.shape[0],120)
    y_oh.scatter_(1, y.unsqueeze(1), 1)

    # do the prediction
    y_hat=model(x)
    y_=torch.max(y_hat)

    loss=crit(y,y_)
    op.zero_grad()
    loss.backward()
    op.step()

错误:

RuntimeError Traceback (most recent call last) <ipython-input-190-46a21ead759a> in <module>
       6 
       7     y_hat=model(x)
 ----> 8     loss=crit(y_oh,y_hat)
       9     op.zero_grad()
      10     loss.backward()

***RuntimeError: 1D target tensor expected, multi-target not supported***

【问题讨论】:

标签: python tensorflow machine-learning computer-vision pytorch


【解决方案1】:

您正在使用的NLLLoss 需要真实目标类的索引。顺便提一句。您不必将目标转换为 one-hot 向量并直接使用 y 张量。

还要注意NLLLoss 期望分布输出分布在对数域中,即使用nn.LogSoftmax 而不是nn.Softmax

【讨论】:

    猜你喜欢
    • 2020-10-08
    • 2019-04-20
    • 2021-08-25
    • 2020-12-18
    • 2017-10-23
    • 2018-09-03
    • 2016-08-01
    • 2021-10-07
    • 2019-06-19
    相关资源
    最近更新 更多