Boostcamp AI tech 3기/TIL

TIL 2022-01-24(월) pytorch basics

mcdn 2022. 1. 24. 19:10
반응형

#부스트캠프3기 

#TIL

Today I Learned 
Date : 20220124(월)

□ Facts

PyTorch
Numpy + AutoGrad + Function
Numpy 구조를 가지는 Tensor 객체로 array 표현

자동미분을 지원하여 DL 연산을 지원

다양한 형태의 DL을 지원하는 함수와 모델을 지원함
Dataset, Multi-GPU ....

 

지금 표준은 파이토치와 텐서플로 두 개다.

케라스 자체가 연산 지원하기 보다 이러한 다른 언어를 쉽게 쓸 수 있게 함
케라스는 텐서플로 사에 흡수되었다.
파이토치와 텐서플로 가장 큰 차이는 그래프 그리는 점
하나는 스태틱 -> 백프로포게이션
파이토치는 실행 시점에서 그래프를 그린다.
자동미분 실행시점에서 그래프를 그린다.

squeeze, unsqueeze

위의 그림과 같이 squeeze는 차원을 줄이고(2차원을 3차원으로 만들어줌) unsqueeze는 차원을 높이는 역할


unsqueeze에 들어가는 숫자 인자(dim=0,1,2)에 따라 위에서 부터

차례로 (1,2,2), (2,1,2), (2,2,1)로 변하는 것을 확인할 수 있다.

 

 

 

!!! 주목할 점이 matmul과 mm이다.

matmul과 mm은 똑같은 행렬 곱 함수처럼 보이지만 큰 차이를 갖고 있다.
matmul은 broadcasting을 지원하지만 

mm은 지원하지 않는다는 점이다.

broadcasting은 쉽게 이해하기 어려움 그래서 지원안하는 경우

 

a = torch.rand(5,2,3)
b = torch.rand(3)
a.mm(b)
#RuntimeError: b is not a matrix
a = torch.rand(5,2,3)
b = torch.rand(3)
a.matmul(b)
#tensor([[0.2226, 0.4806],
#        [0.1674, 0.2030],
#        [0.1646, 0.4643],
#        [0.4087, 0.5624],
#        [0.4658, 0.3754]])

mm은 연산이 되지 않지만 matmul은 broadcasting을 통해 연산이 된 점을 확인할 수 있다.

 

결론 

dot 함수는 matrix multiplication을 지원하지 않는다.
반대로 mm 함수는 matrix multiplication만을 지원한다.matmul도 지원한다. 

mm은 broadcasting을 지원하지 않는다. 

matmul은 지원한다. 

 

5. AutoGrad (중요)

Pytorch의 핵심은 자동 미분을 지원한다는 점이다.(backward 함수)

w = torch.tensor(2.0, requires_grad=True)
y = w**2
z = 10*y + 50

z.backward()
w.grad()
#tensor(40.)

다음은 백터의 편미분에 대한 예시이다.

a = torch.tnesor([2.,3.],requires_grad=True)
b = troch.tensor(6.,4.], requires_grad=True)
Q = 3*a**3 - b**2

external_grad = torch.tensor([1.,1.])
Q.backward(gradient=external_grad)

 

 

□ Findings 

Q. reshape vs view

tensor.shape과 tensor.size는 기능이 같다. size라는 torch의 오리지널 함수이 있지만 shape는 numpy user를 위해 더해진 것

하지만 reshpae view는 차이가 있다. 

tensor.view()는 contiguous tensors에서만 동작하고 절대 메모리를 카피하지 않는다. 

만약 non-contiguous tensor에서 view를 쓰려고하면 에러가 난다. 

tensor.reshape()는 반면 어떤 tensor에서든지 사용 가능하며, 만약 필요하다면 새로 메모리를 할당해서 만든다. 

비슷하지만 다른 두 함수. 

 

만약 기존 오리지널 배열의 값이 바뀌었을 때 참조했던 값도 모두 바뀌길 원한다면 view를 써야한다. 

(SQL에서 view랑 비슷하다고 생각하면 될 듯)

만약 이 동작을 원하지 않고 독립적으로 값을 참조하길 원한다면 reshape를 써야한다. 

 

view를 쓰라고 권장하는 경우, 오리지널 값을 따라가길 원한다는 의미에서 말한거고 

reshape를 쓰라고 권장하는 경우, view와 독립적 패턴을 유지하길 원하는 의미에서 말한듯. 

 

Q. autograd에서 a는 (3,2) b는 (4,6)을 넣은 이유? 

실제 예시라고, 이유는 크게 있지 않은 듯 

 

□ Feelings 

월요일 시작! pytorch라 새롭게 코드를 이것저것 실행해봐서 재밌었다. 

ppt를 그냥 복사해오기 보다 직접 다시 그리는 것이 좋을 것 같아

아이패드에 몇개 그려봤는데 로고 그리는게 젤 재밌음 

텐서플로 로고 그려봤다. 

 

 

 

□ Future

1/24(화)

4강 5강 수강, 

 

반응형

'Boostcamp AI tech 3기 > TIL' 카테고리의 다른 글

TIL 2022-01-21(금) cnn, rnn  (0) 2022.01.24
TIL 2022-01-20 벡터, 행렬, 경사하강법까지  (1) 2022.01.20
TIL 2022-01-19 시작  (0) 2022.01.19