autograd
autograd 패키지
- Tensor의 모든 연산에 대해 자동 미분 제공 (define-by-run)
- 코드를 어떻게 작성하여 실행하느냐에 따라 역전파가 정의
Tensor
- torch.Tensor → requires_grad → true하면, 그 tensor에서 이뤄진 모든 연산들을 추적(track)하기 시작
- 계산 완료후 .backward()를 호출하여 모든 변화도(gradient 기울기)를 자동으로 계산 가능
- 이 tensor의 gradient는 .grad에 누적
- 기록 추적 중단 : .detach
- 기록 추적 방지 코드 블럭 : with torch.no_grad():
→ requires_grad=True가 설정되어 학습 가능한 매개변수를 갖는 모델을 평가할 때 유리
Function Class
- Tensor와 Function은 서로 연결
- 모든 연산 과정을 부호화(encode)하여 순환하지 않는 그래프 생성
- 각 tensor는 .grad_fn 속성을 가지고 있음
- 이는 Tensor를 생성한 Function을 참조하고 있음.
도함수 계산을 위해서는 Tensor의 .backward()를 호출하면 된다.
- Tensor가 scalar인 경우는 backward에 인자를 정해줄 필요가 없다.
- 그러나 여러 개의 요소를 갖고 있을 때는 tensor의 모든 양을 gradient의 인자로 지정할 필요가 있다.
import torch
print("NO GRAD")
x1 = torch.ones(2, 2) # 연산을 기록
print(x1)
y1 = x1 + 2
print(y1)
print("REQUIRES_GRAD")
x2 = torch.ones(2, 2, requires_grad=True) # 연산을 기록
print(x2)
y2 = x2 + 2
print(y2)
NO GRAD
tensor([[1., 1.],
[1., 1.]])
tensor([[3., 3.],
[3., 3.]])
REQUIRES_GRAD
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward0>)
y2의 경우 연산의 결과로 생성된 것이므로 grad_fn을 갖는다.
(y1 X)
print(y1.grad_fn)
print(y2.grad_fn)
None
<AddBackward0 object at 0x000001EF47BF9A90>
추가 연산 수행
z2 = y2 * y2 * 3
out = z2.mean()
print(z2, out)
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
'Language&Framework&Etc > Pytorch' 카테고리의 다른 글
Pytorch Multi-GPU 정리 중 (0) | 2021.12.19 |
---|---|
Pytorch 데이터 로딩 방법 (0) | 2021.06.07 |
Pytorch란 무엇인가요? - 연산 (Pytorch 학습 2) (0) | 2021.04.16 |
Pytorch란 무엇인가요? - 시작하기 (Pytorch 학습 1) (0) | 2021.04.16 |
TorchVision model funetuning (0) | 2021.01.30 |