我正在尝试为FCN实现损失功能。我的输出是形状的张量(n,c,h,w)。我的目标是形状(h,w)。我想计算输出和张量之间的损失,但问题是我有一个面具。我只对图像的某个部分感兴趣,可以计算出损失并对其进行训练(我想忽略其余部分)。我试图通过将图像展开成阵列然后在其上应用蒙版来实现我的目标。然后,我将计算损失。当我这样做时,会收到错误消息:
RuntimeError:断言`cur_target> = 0 && cur_target
请查看我的代码(因为我是新来的,所以可能会有更简单的方法来完成此操作):
def Loss(inp, target, mask):
mask=torch.from_numpy(np.array(mask, dtype=np.uint8))
target=target.contiguous().view(-1,1) #Flattening the Target Image
mask = mask.contiguous().view(-1, 1) #Flattening Mask
target = target[~mask] #Masking Target
n, c, h, w = inp.size()
inp1=np.zeros((target.shape[0],c)) #Creating new empty array with dimensions of (masked_region, c)
inp1=torch.from_numpy(inp1)
for i in range( c):
inp1[:,i]=inp[0,i,:,:].view(-1,1)[~mask] #Masking the input and filling in the array created
log_p = F.log_softmax(inp1, dim=1)
criterion=nn.NLLLoss()
loss = criterion(log_p, target)
return loss
答案 0 :(得分:0)
假设inp
和target
变量都是表示图像的张量,我看不到为什么需要使用log_softmax
以及为什么要使用NLLLoss
作为损失功能。
尝试废弃softmax并使用MSELoss
作为损失函数,这是使用您的代码的示例:
def Loss(inp, target, mask):
mask=torch.from_numpy(np.array(mask, dtype=np.uint8))
target=target.contiguous().view(-1,1) #Flattening the Target Image
mask = mask.contiguous().view(-1, 1) #Flattening Mask
target = target[~mask] #Masking Target
n, c, h, w = inp.size()
inp1=np.zeros((target.shape[0],c)) #Creating new empty array with dimensions of (masked_region, c)
inp1=torch.from_numpy(inp1)
for i in range( c):
inp1[:,i]=inp[0,i,:,:].view(-1,1)[~mask] #Masking the input and filling in the array created
criterion=nn.MSELoss(reduction='sum')
loss = criterion(inp1, target)
return loss