Open source DL framework로 GPU를 이용한 Tensor computing, Automatic differentiation system을 지원한다.
PyTorch Tensor는 GPU acceleration을 제외하면 NumPy ndarrays와 유사하다.
아래는 Python의 list를 각각 numpy와 tensor로 만드는 방법이다.
ones()
, zeros()
함수를 이용하면 1과 0으로 채운 numpy와 tensor를 만들 수 있다.
ones_like()
와 zeros_like()
를 이용하면 입력 numpy 배열, 텐서와 동일한 모양의 0과 1로 채워진 numpy 배열, 텐서를 만들 수 있다.
dtype
사용아래와 같이 index를 이용하여 접근할 수 있다.
index로 접근 시 tensor 형태로 반환되는데, python number를 얻기 위해서는 item()
을 사용하면 된다.
index로 접근해서 값 변경도 가능하다.
아래와 같이 원하는 부분을 추출하는 slicing도 이용할 수 있다.
다음과 같이 Negative slicing 도 가능하다.
전치 행렬 (행과 열을 교환하여 얻는 행렬)을 얻고 싶은 경우에는 .T
를 이용하면 된다.
tensor의 shape을 알고 싶은 경우에는 .shape
을 이용하면 된다.
torch.sum(input, dim, keepdim=False, *, dtype=None)
→ Tensor
𝑋.sum()
and torch.sum(𝑋)
torch.mean(input, dim, keepdim=False, *)
→ Tensor
sum과 파라미터 및 사용법이 유사하다! 평균을 구하는데 이용한다.
torchmax(input, dim, keepdim=False, *)
→ Tensor
sum과 파라미터 및 사용법이 유사하다! 최대값을 구하는데 이용한다.
tensor간 binary operator를 사용하는 경우, 원소별(element-wise)로 계산해준다.
.inner()
를 사용해서 내적을 계산할 수 있다.
이제 텐서의 shape, dimension 등을 조작하는 방식을 알아보자.
X.view(*shape)
를 이용해서 사용자가 원하는 shape으로 바꿀 수 있다. 이 때 지정되는 shape은 element의 개수가 동일해야한다. 즉, data와 element 개수는 동일하지만 지정된 shape의 tensor로 만들어주는 것이다! ex) 6*2*2 => 3*4*2
squeeze는 차원을 줄일 때 사용하고, unsqueeze는 차원을 늘릴 때 사용한다!
뒤쪽 dimension부터 비교할 때, 1이거나 차원이 없는 경우일 때 broadcasting이 이루어질 수 있다. 아래 사진을 보며 이해해보자.
from_numpy()
를 이용하여 numpy를 tnesor로 바꿀 수 있고, numpy()
를 이용하여 tensor를 numpy로 바꿀 수 있다.
우리는 이전에 gradient descent를 사용하기위해 chain rule을 이용하여 미분 값을 계산했다. 하지만 앞서 살펴본 작은 모델과 달리 큰 모델들의 파라미터는 수천만개도 넘는다. 이를 일일히 계산하기는 매우 비효율적일 것이다... 이런 파라미터들의 자동미분을 도와주는 것이 바로 torch.autograd
라는 PyTorch의 자동미분 엔진이다. 아래와 같이 model parameter의 requires_grad
를 True로 설정해주면, 해당 model parameter의 gradient를 자동으로 추적해준다!
그리고는 아래와 같이 loss.backward()
를 호출하면, 자동으로 역전파가 이루어지는 것이다!
아래와 같이 gradient의 추적을 끄고 킬 수도 있다. validation, test와 같이 미분값 계산에 따른 파라미터 업데이트가 필요하지 않은 곳에 torch.no_grad()
를 쓰면 되는 것이다!