Реализация функции потерь для FCN на Pytorch - PullRequest
1 голос
/ 07 июля 2019

Я пытаюсь реализовать функцию потерь для FCN.Мой вывод - тензор формы (n, c, 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 голосов
/ 07 июля 2019

Предполагая, что переменные 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
...