首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用带交叉熵损失的单热编码?

如何使用带交叉熵损失的单热编码?
EN

Stack Overflow用户
提问于 2020-05-11 06:06:22
回答 1查看 1.5K关注 0票数 1

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

我的模型代码如下所示:

代码语言:javascript
复制
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()

错误:

代码语言:javascript
复制
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***
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-11 07:24:22

您正在使用的预期目标类的NLLLoss。顺便说一句。你不需要把你的目标转换成一个热向量,直接使用y张量。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61723290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档