Pytorch ret=torch.\u C.\u nn.nll\u loss2d中出错(输入、目标、权重、减少、获取枚举(减少)、忽略索引)

Pytorch ret=torch.\u C.\u nn.nll\u loss2d中出错(输入、目标、权重、减少、获取枚举(减少)、忽略索引),pytorch,Pytorch,输入图像大小为512*512,以适应resnet的输入。 我曾经 在数据加载器中。 我使用resnet50作为我的网络主干,没有fc。输出形状为 [4,2048,16,16] 然后使用两个(conv bn relu)和一个插值 def forward(self, input): x=self.backbone(input) x = self.conv1(x) x= self.bn1(x) x = self.relu(x)

输入图像大小为512*512,以适应resnet的输入。 我曾经

在数据加载器中。 我使用resnet50作为我的网络主干,没有fc。输出形状为

[4,2048,16,16]
然后使用两个(conv bn relu)和一个插值

    def forward(self, input):
        x=self.backbone(input)
        x = self.conv1(x)
        x= self.bn1(x)
        x = self.relu(x)
        x = self.conv2(x)
        x= self.bn2(x)
        x = self.relu(x)
        x = F.interpolate(x, size=[512,512], mode='bilinear', align_corners=True)
        return x
训练部分

    self.criterion=nn.CrossEntropyLoss()
    if self.args.cuda:
        image, target = image.cuda(), target.cuda()
    self.scheduler(self.optimizer, i, epoch, self.best_pred)
    self.optimizer.zero_grad()
    output = self.model(image)
    loss = self.criterion(output, target.long())
    loss.backward()
但是错误发生了

File "E:/python_workspace/1006/train.py", line 135, in training
loss = self.criterion(output, target.long())
File "E:\python_workspace\1006\utils\loss.py", line 28, in CrossEntropyLoss
loss = criterion(logit, target.long())
File "E:\anaconda3\lib\site-packages\torch\nn\modules\module.py", line 547, in __call__
result = self.forward(*input, **kwargs)
File "E:\anaconda3\lib\site-packages\torch\nn\modules\loss.py", line 916, in forward
ignore_index=self.ignore_index, reduction=self.reduction)
File "E:\anaconda3\lib\site-packages\torch\nn\functional.py", line 1995, in cross_entropy
return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)
File "E:\anaconda3\lib\site-packages\torch\nn\functional.py", line 1826, in nll_loss
ret = torch._C._nn.nll_loss2d(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
RuntimeError: Assertion `cur_target >= 0 && cur_target < n_classes' failed.  at C:\w\1\s\tmp_conda_3.6_045031\conda\conda-bld\pytorch_1565412750030\work\aten\src\THNN/generic/SpatialClassNLLCriterion.c:111

image.shape is [4, 3, 512, 512],dtype is torch.float32
target.shape is [4, 512, 512],dtype is torch.float32
output.shape is [4, 3, 512, 512],dtype is torch.float32
文件“E:/python\u workspace/1006/train.py”,第135行,培训中
损耗=self.criteria(输出,target.long())
文件“E:\python\u workspace\1006\utils\loss.py”,第28行,在CrossEntropyLoss中
损失=标准(logit,target.long())
文件“E:\anaconda3\lib\site packages\torch\nn\modules\module.py”,第547行,在调用中__
结果=自我转发(*输入,**kwargs)
文件“E:\anaconda3\lib\site packages\torch\nn\modules\loss.py”,第916行,向前
忽略索引=自我。忽略索引,减少=自我。减少)
文件“E:\anaconda3\lib\site packages\torch\nn\functional.py”,第1995行,交叉显示
返回nll_损失(log_softmax(输入,1),目标,重量,无,忽略索引,无,减少)
nll\U文件“E:\anaconda3\lib\site packages\torch\nn\functional.py”,第1826行
ret=torch.\u C.\u nn.nll\u loss2d(输入、目标、权重、缩减、获取枚举(缩减)、忽略索引)
运行时错误:断言'cur\u target>=0&&cur\u target
目标图像都只有三种不同的颜色,所以我将输出设置为3通道,图像模式为P
我的代码中哪里可能有问题?

根据您的TERNSOR的大小判断,您的
批次大小=4
。您试图预测每像素三个标签中的一个,即
n_classes=3

您得到的错误是:

运行时错误:断言'cur\u target>=0&&cur\u target
表示您提供给丢失函数的
target.long()
的值为负值或大于
n\u类

检查你阅读地面真相标签的方式。如果它是
P
类型的图像,则需要将其本身读取,而不是将其转换为RGB值

PS,

不要使用
align_corners=True
F.interpolate
中,它会引入失真。

您的意思是我应该将目标图像的值更改为数字,例如背景为0,目标为1,其他值为2?我尝试了该方法,但得到了相同的错误。我删除了F.interpolate中的align_corners=True。@faustowang align corners与错误无关,但这是一个好方法practice@faustowang验证您的目标确实只有这三个值。刚才,我发现我使用了“if mask[xx,yy]==16:mask[xx,yy]=2 elif mask[xx,yy]==20:带错误的掩码[xx,yy]=1”。所以我附加了“else:mask[xx,yy]=0”。这很有效。也许分割过程需要调整。欣赏
File "E:/python_workspace/1006/train.py", line 135, in training
loss = self.criterion(output, target.long())
File "E:\python_workspace\1006\utils\loss.py", line 28, in CrossEntropyLoss
loss = criterion(logit, target.long())
File "E:\anaconda3\lib\site-packages\torch\nn\modules\module.py", line 547, in __call__
result = self.forward(*input, **kwargs)
File "E:\anaconda3\lib\site-packages\torch\nn\modules\loss.py", line 916, in forward
ignore_index=self.ignore_index, reduction=self.reduction)
File "E:\anaconda3\lib\site-packages\torch\nn\functional.py", line 1995, in cross_entropy
return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)
File "E:\anaconda3\lib\site-packages\torch\nn\functional.py", line 1826, in nll_loss
ret = torch._C._nn.nll_loss2d(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
RuntimeError: Assertion `cur_target >= 0 && cur_target < n_classes' failed.  at C:\w\1\s\tmp_conda_3.6_045031\conda\conda-bld\pytorch_1565412750030\work\aten\src\THNN/generic/SpatialClassNLLCriterion.c:111

image.shape is [4, 3, 512, 512],dtype is torch.float32
target.shape is [4, 512, 512],dtype is torch.float32
output.shape is [4, 3, 512, 512],dtype is torch.float32
RuntimeError: Assertion `cur_target >= 0 && cur_target < n_classes' failed.