在Pytorch上实现FCN的损失功能

时间:2019-07-07 15:47:01

标签: python deep-learning conv-neural-network pytorch

我正在尝试为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

1 个答案:

答案 0 :(得分:0)

假设inptarget变量都是表示图像的张量,我看不到为什么需要使用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