2017-11-13 2 views
0
내 신경 조직의 손실을 계산하는 동안 다음과 같은 오류 메시지가 무엇입니까

: FloatClassNLLCriterion_updateOutput 인수의 잘못된 조합을 받았다 - (INT, torch.FloatTensor, torch.FloatTensor! torch.FloatTensor 가지고 : 형식 오류!을 , 토치 .FloatTensor 입력, 토치 .LongTensor 목표, torch.FloatTensor 출력, bool 크기 평균, [torch.FloatTensor 가중치 또는 없음], torch.FloatTensor total_weight, bool, NoneType, torch.FloatTensor, int) int ignore_index)이 줄의 : 손실 = 기준 (outputs, one_hot_target).Pytorch FloatClassNLLCriterion_updateOutput 오류

여러 가지 시도를하고 웹을 검색했지만 내 실수를 찾지 못하는 것 같습니다. 누군가 아이디어가 있습니까? 사용

코드 :

class Net(nn.Module): 
def _init_(self,input_size,hidden_size, num_classes): 
    super(Net, self)._init_() 
    self.l1 = nn.Linear(input_size,hidden_size) 
    self.l2 = nn.Linear(hidden_size,num_classes) 

def forward(self,x): 
    x = self.l1(x) 
    x = F.tanh(x) 
    x = self.l2(x) 
    x = F.softmax(x) 
    return x 

mlp = Net(input_size,hidden_size,num_classes) 

criterion = nn.NLLLoss() 
optimizer = torch.optim.SGD(mlp.parameters(), lr=learning_rate) 

for i in range(N-1,len(word_list)): 

    # Define input vector x 
    x = None 


    for j in range(0,N-1): 
     try: 
      x = np.r_[x,w2v[word_list[j]]] 
     except: 
      x = w2v[word_list[j-N+1]] 

    # Done with defining x 


    np.reshape(x,(len(x),1)) 
    x = autograd.Variable(torch.FloatTensor(x)) 
    optimizer.zero_grad() 

    outputs = mlp(x) 
    outputs = outputs.unsqueeze(0) 
    outputs = outputs.transpose(0,1) 

    index = w2i[word_list[i]] 
    one_hot_target = np.zeros([num_classes,1],dtype=float) 

    one_hot_target[index] = float(1) 

    one_hot_target = autograd.Variable(torch.Tensor(one_hot_target)) 
    print (one_hot_target) 
    loss = criterion(outputs,one_hot_target) 
    #loss.backward() 
    #optimizer.step() 

답변

0

당신이 당신의 손실 함수에 전달하는 대상 텐서는 Float 형 텐서이다. 그것은 여기에서 일어나고 있습니다 : one_hot_target = autograd.Variable(torch.Tensor(one_hot_target))

즉, PyTorch의 기본 Tensor 유형이 FloatTensor이기 때문입니다. 그러나 NLLLoss() 함수는 LongTensor를 대상으로합니다. 다음 문서에서 예제를 다시 한 번 확인할 수 있습니다 : NLLLoss Pytorch docs.

당신은 단순히 이런 LongTensor에 대상 텐서를 변환 할 수 있습니다 : 우리의 문제를 해결

one_hot_target = autograd.Variable(torch.Tensor(one_hot_target)).long()

+0

감사합니다. 그러나 다음과 같은 오류 메시지가 표시되지 않습니다. RuntimeError : /opt/conda/conda-bld/pytorch_1503970438496/work/torch/lib/THNN/generic/ClassNLLCriterion.c:22에서 다중 대상이 지원되지 않습니다. 어떻게이 문제를 해결했는지 알 겠어? – Stefan1993

+0

내 생각 엔'one_hot_target'은 1- 핫 벡터 표현을 포함하고있을 것입니다. 그러나 올바른 클래스의 인덱스를 전달해야합니다. – blckbird