[TIL] clone()

YSL·2023년 9월 4일
0

PyTorch

목록 보기
4/5
post-thumbnail

Problem

목표 : 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).

Solution

true_value, pred = values, prediction_scores.squeeze()true_value, pred = values.clone(), prediction_scores.clone().squeeze()
loss.backward() 시 오류가 발생한 것으로, clone()을 추가하여 원본 객체와 동일한 속성을 가지는 새로운 객체를 생성하여 넘겨주니 에러가 해결되었다.

clone() 외에도 detach() 등을 사용해서 동일한 에러를 해결할 수 있다고 한다.
kyujinpy님의 티스토리

0개의 댓글