我尝试过使用一种热编码来对大约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***发布于 2020-05-11 07:24:22
您正在使用的预期目标类的NLLLoss。顺便说一句。你不需要把你的目标转换成一个热向量,直接使用y张量。
还请注意,NLLLoss期望对数域中的分布输出分布,即使用nn.LogSoftmax而不是nn.Softmax。
https://stackoverflow.com/questions/61723290
复制相似问题