[RuntimeError]: element 0 of tensors does not require grad and does not have a grad_fn

Hyun·2022년 8월 4일
0

ERROR

목록 보기
5/6

발생한 에러 요약

  1. loss.backward() 중 grad가 없다는 에러 발생
    => loss에 requires_grad(True)로 grad 할당 ( 이전 grad는 없는 것! )
  2. 오류는 해결, 하지만 전혀 훈련이 되지 않는 것으로 보였다.(평가지표가 제자리)
    => model의 output에 grad를 계산하도록 함 => output에는 이미 grad가 적용되어있었다.
  3. output을 argmax하면 grad가 사라짐(그래서 loss에 grad가 없던 것!)
    => argmax를 사용하지 않기 위해 label형태를 output과 비슷하게 바꿈
  4. loss함수에서 Double 데이터타입으로 인해 에러가 발생(Float가 필요함)
    => loss함수의 매개변수에 직접 .float()를 적용
  5. 평가지표가 제자리
    => learning rate 조절 => 평가지표가 변하긴 하지만 성능이 더 나아지지 않는다.

loss.backward() 중 grad가 없다는 에러가 났다.

# nn.MSELoss()의 예제
loss = nn.MSELoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.randn(3, 5)
>>> output = loss(input, target)
>>> output.backward()

input data가 token 번호라 정수를 가지기 때문에 grad 계산을 하도록 float로 변환을 하는 게 맞는가? 하는 생각에 loss에 grad를 주었다.


오류는 사라졌지만, 전혀 훈련이 되지 않는 것으로 보였다.(평가지표가 제자리)

그래서 모델의 결과물에 grad를 계산하도록 했는데,

output = model(**args)
output.requires_grad(True)

다음과 같은 에러가 떴다.

TypeError: 'bool' object is not callable

output = model(**args)
print(output)		# grad 주기 전 output 출력 => 그런데, 이미 grad 적용 되어있음
output.requires_grad(True)

output은 다음과 같은 형태였다.

그런데, 이미 grad가 계산되도록 되어있는데..?
[-0.0805, 0.3158]]], device='cuda:0', grad_fn=<ViewBackward0>)

argmax를 취한 뒤 다시 출력했을 때, grad가 사라져있었다.

output = model(**args)
outputs = torch.argmax(outputs, dim=2)
print(outputs)		# grad 없음
outputs.requires_grad(True)		# 오류 발생

마찬가지로 다음과 같은 에러가 떴다.

TypeError: 'bool' object is not callable


이번에는 label형태를 output과 비슷하게 바꿔보았다.

output shape : (batch_size, 512, 2)
label shape : (batch_size, 512) => (batch_size, 512, 2)

RuntimeError: Found dtype Double but expected Float


loss 함수의 매개변수에 직접 float()형으로 바꿔 해결하였다.

loss = loss_fct(outputs.float(), batch_label.float())

0개의 댓글