2017-12-08 3 views
1

5D 입력 텐서에서 3D 컨볼 루션을 수행하는 네트워크가 있습니다. (BatchSize, NumClasses, x-dim, y-dim, z-dim)에 해당하는 크기 (1, 12, 60, 36, 60) 인 경우 네트워크 출력. voxel-wise 크로스 엔트로피 손실을 계산해야합니다. 그러나 나는 오류가 계속 발생합니다. 예제 Pytorch의 3D 의미 론적 세분화를위한 CrossEntropyLoss

torch.nn.CrossEntropyLoss() 사용하여 교차 엔트로피 손실을 계산하기 위해 노력하고, 나는 다음과 같은 오류 메시지가 점점 계속 : 내가 만들 때

import torch 
import torch.nn as nn 
from torch.autograd import Variable 
criterion = torch.nn.CrossEntropyLoss() 
images = Variable(torch.randn(1, 12, 60, 36, 60)).cuda() 
labels = Variable(torch.zeros(1, 12, 60, 36, 60).random_(2)).long().cuda() 
loss = criterion(images.view(1,-1), labels.view(1,-1)) 

같은 일이 발생 : 여기

RuntimeError: multi-target not supported at .../src/THCUNN/generic/ClassNLLCriterion.cu:16 

것은 내 코드의 추출물 라벨을위한 일 핫 텐서 :

nclasses = 12 
labels = (np.random.randint(0,12,(1,60,36,60))) # Random labels with values between [0..11] 
labels = (np.arange(nclasses) == labels[..., None] - 1).astype(int) # Converts labels to one_hot_tensor 
a = np.transpose(labels,(0,4,3,2,1)) # Reorder dimensions to match shape of "images" ([1, 12, 60, 36, 60]) 
b = Variable(torch.from_numpy(a)).cuda() 
loss = criterion(images.view(1,-1), b.view(1,-1)) 

잘못하고있는거야? 누군가가 5D 출력 텐서에서 교차 엔트로피 계산의 예를 제공 할 수 있습니까?

답변

0

docs이 행동을 설명은 (결론은, 그것이 실제로하여 출력의 모든 차원에 대한 목표를 필요로하지의 스파 스 크로스 엔트로피 손실을 계산하는 것처럼 보이지만, 필요한 하나의 인덱스 만) ...

Input: (N,C), where C = number of classes 
Target: (N), where each value is 0 <= targets[i] <= C-1 
Output: scalar. If reduce is False, then (N) instead. 

나는 당신의 사용 사례에 대해 잘 모르겠지만, 당신은 KL Divergence 또는 Binary Cross Entropy Loss 대신 사용할 수도 있습니다 : 그들은 구체적으로 명시. 둘 다 동일한 크기의 입력 및 대상에 대해 정의됩니다.

0

2D 의미 론적 세분화를 위해 일부 구현 (fcn)을 확인하고이를 3D 의미 적 세분화에 적용하려고했습니다. 이것이 옳다는 보장이 없으면, 다시 확인해야합니다 ...

import torch 
import torch.nn.functional as F 
def cross_entropy3d(input, target, weight=None, size_average=True): 
    # input: (n, c, h, w, z), target: (n, h, w, z) 
    n, c, h, w , z = input.size() 
    # log_p: (n, c, h, w, z) 
    log_p = F.log_softmax(input, dim=1) 
    # log_p: (n*h*w*z, c) 
    log_p = log_p.permute(0, 4, 3, 2, 1).contiguous().view(-1, c) # make class dimension last dimension 
    log_p = log_p[target.view(n, h, w, z, 1).repeat(1, 1, 1, 1, c) >= 0] # this looks wrong -> Should rather be a one-hot vector 
    log_p = log_p.view(-1, c) 
    # target: (n*h*w*z,) 
    mask = target >= 0 
    target = target[mask] 
    loss = F.nll_loss(log_p, target.view(-1), weight=weight, size_average=False) 
    if size_average: 
     loss /= mask.data.sum() 
    return loss 
images = Variable(torch.randn(5, 3, 16, 16, 16)) 
labels = Variable(torch.LongTensor(5, 16, 16, 16).random_(3)) 
cross_entropy3d(images, labels, weight=None, size_average=True)