목표 : tensor 중 원래 입력값이 nan인 부분의 인덱스를 얻어 label과 pred에서 해당 인덱스를 0.0으로 대체하여 loss 계산 시 nan으로 계산되는 것 해결하기
nan_mask = torch.isnan((values))
nan_idx = torch.nonzero(nan_mask)
true_value, pred = values, prediction_scores.squeeze()
for idx in nan_idx:
true_value[idx[0], idx[1]] = 0.0
pred[idx[0], idx[1]] = 0.0
masked_lm_loss = loss_fct(pred.view(-1),true_value.view(-1))
return masked_lm_loss, pred.view(-1), true_value.view(-1)
모델을 train하는 함수를 실행해보니 아래와 같은 에러가 발생하였다.
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [1, 1]] is at version 38; expected version 0 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).
true_value, pred = values, prediction_scores.squeeze()
→ true_value, pred = values.clone(), prediction_scores.clone().squeeze()
loss.backward() 시 오류가 발생한 것으로, clone()
을 추가하여 원본 객체와 동일한 속성을 가지는 새로운 객체를 생성하여 넘겨주니 에러가 해결되었다.
clone()
외에도 detach()
등을 사용해서 동일한 에러를 해결할 수 있다고 한다.
kyujinpy님의 티스토리