일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- MySQL
- 통계학
- 티스토리
- Linux
- tensorflow
- 서평단
- Ga
- 파이썬
- 딥러닝
- Visualization
- 한빛미디어서평단
- Blog
- Python
- 독후감
- 시각화
- 월간결산
- 서평
- Tistory
- python visualization
- 리눅스
- 매틀랩
- 블로그
- MATLAB
- SQL
- matplotlib
- 파이썬 시각화
- Google Analytics
- 텐서플로
- 한빛미디어
- Pandas
- Today
- Total
pbj0812의 코딩 일기
[PYTORCH] 02_pytorch with examples (tensor) 본문
Pytorch with examples (numpy) 코드 분석
- 아래 글은 파이토치 튜토리얼 중 numpy 부분을 학습하여 영상으로 만든 것을 재구성한 글입니다.
원본링크 : https://pytorch.org/tutorials/beginner/pytorch_with_examples.html
유투브 영상 : https://youtu.be/Lh-7pkZxFDA
Tensor 장점
- numpy와 유사하다
- GPU를 사용하였을 때 CPU에 비하여 50배 이상의 속도를 얻을 수 있다.
- PyTorch는 Tensor에 관한 많은 함수들을 지원한다.
- GPU를 사용하기 위해서는 단순히 데이터 타입만 새로 지정해주면 된다.
코드 프리뷰
- 전체 코드이다.
- 지난 글과 동일한 형태의 모델을 구성한 코드이다.
설계도
- 위 코드를 토대로 작성한 설계도이다.
Device setting
dtype = torch.float
# device = torch.device("cpu")
device = torch.device("cuda:0")
- 첫 번째 줄에서는 tensor를 사용하기 위한 데이터 타입을 지정하였다.
- 아랫줄에서는 CPU를 선택할 지 GPU를 선택할 지 지정하는 구문이다.
- CPU를 사용하고 싶으면 두번째 줄의 주석을 풀고, GPU를 사용하고 싶으면 세번째 줄의 주석을 풀어준다.
Hyper parameter setting
N, D_in, H, D_out = 64, 1000, 100, 10
learning_rate = 1e-6
x = torch.randn(N, D_in, device=device, dtype=dtype)
y = torch.randn(N, D_out, device=device, dtype=dtype)
w1 = torch.randn(D_in, H, device=device, dtype=dtype)
w2 = torch.randn(H, D_out, device=device, dtype=dtype)
''' 지난시간
N, D_in, H, D_out = 64, 1000, 100, 10
learning_rate = 1e-6
x = np.random.randn(N, D_in)
y = np.random.randn(N, D_out)
w1 = np.random.randn(D_in, H)
w2 = np.random.randn(H, D_out)
'''
- 코드에서 아래 주석부분은 지난 글에서 작성한 코드이다.
- 하이퍼 파라미터 세팅 부분이다.
- 함수 사용법과 옵션(dtype, device)이 다르다는 점을 빼고는 동일하다.
h layer 생성
h = x.mm(w1)
'''지난시간
h = x.dot(w1)
'''
- x와 w1을 곱하여 h layer를 구현하였다.
- 이때 w1의 행의 갯수는 입력값의 수가 되고, 열의 갯수는 출력값의 갯수로 표현하기 위해 사다리꼴로 만들었다.
- numpy를 사용했을 때는 dot 함수를 사용하고 torch에서는 mm을 사용하였다는 것이 다르다.
ReLU 구현
h_relu = h.clamp(min=0)
'''지난시간
h_relu = np.maximum(h, 0)
'''
- np.maximum 함수를 이용하여 ReLU를 구현하였다.
- ReLU는 오른쪽 그림에서 예를 들면 0보다 작은 입력값은 0으로 만들어 버리는 함수로 필요없는 가중치를 지워버린다고 할 수 있다.
- numpy에서는 maximum 함수를 사용하였지만, torch에서는 clamp 함수를 지정하여 output 값의 최소값(=0)을 지정하였다.
예측값 출력
y_pred = h_relu.mm(w2)
'''지난시간
y_pred = h_relu.dot(w2)
'''
- h layer와 w2를 곱하여 예측값을 만들었다.
loss function
loss = (y_pred - y).pow(2).sum().item()
'''지난시간
loss = np.square(y_pred - y).sum()
'''
- loss function으로 (예측값-실제값)^2의 방식을 취하였다.
- 이렇게 제곱을 한 이유로는 두 가지를 들 수 있겠다.
1. loss를 늘리기 위해서이다.
2. 단순히 loss function을 (예측값-실제값)으로 정하게 되면 합하게 될 때 오른쪽 그림과 같은 일이 발생하기 때문으로 보인다.
1) 오른쪽 그림에서 초록색 직선은 실제값, 노란색 동그라미는 예측값을 나타낸다.
2) 오른쪽 위 그림에서 loss는 0이라고 할 수 있다.
3) 오른쪽 아래 그림에서 각 지점에서 loss는 0이 아니지만 다 더하게 되면 0이 된다.
loss function 미분
grad_y_pred = 2.0 * (y_pred - y)
'''지난시간
grad_y_pred = 2.0 * (y_pred - y)
'''
- (예측값-실제값)^2 의 미분값을 구현한 코드이다.
w2 가중치 구현
grad_w2 = h_relu.t().mm(grad_y_pred)
'''지난시간
grad_w2 = h_relu.T.dot(grad_y_pred)
'''
- w2의 가중치를 구현한 코드이다.
- 역산해서 올라가야하기 때문에 전에 만들었던 grad_y_pred 값과 h_relu의 값을 이용하여 만들었다.
- h_relu X w2 = y_pred이기 때문에 w2의 가중치를 구하기 위해서 h_relu를 90도 회전시켰다.
- numpy에서는 T를 사용하여 행렬을 뒤바꾸고, tensor에서는 t()함수를 사용한다.
h layer의 가중치 구현
grad_h_relu = grad_y_pred.mm(w2.t())
'''지난시간
grad_h_relu = grad_y_pred.dot(w2.T)
'''
- 전과 마찬가지의 방식으로 hidden layer의 가중치를 구현한다.
ReLU 구현
grad_h = grad_h_relu.clone()
grad_h[h < 0] = 0
'''지난시간
grad_h = grad_h_relu.copy()
grad_h[h < 0] = 0
'''
- 처음의 h 부분에서 0 이하의 수가 있던 위치를 구하여 0으로 반환시켰다.
w1의 가중치 구현
grad_w1 = x.t().mm(grad_h)
'''지난시간
grad_w1 = x.T.dot(grad_h)
'''
- 위의 방식과 마찬가지로 역산하여 w1의 가중치를 구하였다.
weight 갱신
w1 -= learning_rate * grad_w1
w2 -= learning_rate * grad_w2
'''지난시간
w1 -= learning_rate * grad_w1
w2 -= learning_rate * grad_w2
'''
- 처음에 지정한 learning rate를 w1, w2의 가중치에 곱해준 뒤 w1, w2에서 제하였다.
- 부호가 -인 이유는 loss를 감소시키는 방향으로 진행되어야 하기 때문이다.
속도 비교
- 이 예제에 대해서는 GPU 연산에 비하여 CPU가 4배 정도 빠르다는 것을 보여준다.
- CPU를 사용했을때의 Numpy와 Tensor의 연산속도는 엇비슷하다는 것을 알 수 있다.
'인공지능 & 머신러닝 > PYTORCH' 카테고리의 다른 글
[PYTORCH] 06_pytorch with examples (nn module) (0) | 2019.06.16 |
---|---|
[PYTORCH] 05_pytorch with examples (TensorFlow) (0) | 2019.06.16 |
[PYTORCH] 04_pytorch with examples (autograd 재정의) (0) | 2019.06.10 |
[PYTORCH] 03_pytorch with examples (autograd) (0) | 2019.05.31 |
[PYTORCH] 01_pytorch with examples (numpy) (0) | 2019.05.26 |