웹 개발 메모장
2. Pytorch autograd와 Variable 본문
autograd
Auto Gradient
- autograd를 사용하면 backprop을 위한 미분 값을 자동으로 계산해 줍니다.
- 자동 계산을 위해서 사용하는 변수는
torch.autograd
에 있는 Variable 입니다.
역전파(backpropagation)
복잡한 함수에 대해 텐서들 마다 각각 편미분을 진행하려면 연산량이 엄청나기 때문에, 합성 함수 미분의 성질을 이용하여 훨씬 적은 연산만으로 각 텐서들에 대한 미분을 구하는 방법입니다.
여기서 역전파에 대한 자세한 내용을 다루지는 않겠습니다.
Variable의 모습
-
torch.aurograd.Variable()
을 통해 Variable을 생성합니다.import torch import numpy as np a = torch.Tensor(np.array([[1]])) a = torch.autograd.Variable(a, requires_grad=True)
-
Variable은 아래와 같은 속성들을 갖고 있습니다.
.backward()
가 호출되면 미분이 시작되고 그 정보가 담기게 됩니다.
- data
Tensor 형태의 데이터 - grad
Data가 거쳐온 layer에 대한 미분 값 - grad_fn
미분 값을 계산한 함수에 대한 정보
예시
식 d를 a에 대해 미분한 결과를 보여주는 예제입니다.
import torch
import numpy as np
a = torch.Tensor(np.array([[1]]))
a = torch.autograd.Variable(a, requires_grad=True)
b = a + 2
c = b**2
d = c*3
d.backward()
print("="*50)
print("d.data:", d.data)
print("d.grad:", d.grad)
print("d.grad_fn:", d.grad_fn)
print("="*50)
print("c.data:", c.data)
print("c.grad:", c.grad)
print("c.grad_fn:", c.grad_fn)
print("="*50)
print("b.data:", b.data)
print("b.grad:", b.grad)
print("b.grad_fn:", b.grad_fn)
print("="*50)
print("a.data:", a.data)
print("a.grad:", a.grad)
print("a.grad_fn:", a.grad_fn)
위 코드의 실행 결과입니다.
==================================================
d.data: tensor([[27.]])
d.grad: None
d.grad_fn: <MulBackward0 object at 0x0000025A0F43ABE0>
==================================================
c.data: tensor([[9.]])
c.grad: None
c.grad_fn: <PowBackward0 object at 0x0000025A0F43AC18>
==================================================
b.data: tensor([[3.]])
b.grad: None
b.grad_fn: <AddBackward0 object at 0x0000025A0F43AF60>
==================================================
a.data: tensor([[1.]])
a.grad: tensor([[18.]])
a.grad_fn: None
[Finished in 0.5s]
'옛날.. > pytorch' 카테고리의 다른 글
6. 신경망 학습과 평가 (0) | 2019.07.22 |
---|---|
5. 신경망 정의와 순방향 전파 (0) | 2019.07.22 |
4. Pytorch torchvision에서 데이터셋 가져오기 (0) | 2019.07.21 |
3. Pytorch nn과 nn.functional (1) | 2019.07.21 |
1. Pytorch 소개 (0) | 2019.07.21 |
Comments