본문 바로가기

모두를 위한 딥런닝 by PyTorch

Lab-01 Tensor Manipulation

728x90

KAIST에서 진행하는 프로그램에 참여하면서

처음 딥런닝을 접하게 되었고 프로젝트를 원활하게 수행하기 위해 

기본적인 딥런닝에 대한 지식을 쌓기 위해 

부스트 코스에서 제공하는 파이토치로 시작하는 딥런닝 기초를 

수강하려고 합니다. 어렵다고들 하지만 끝까지 완강 화이팅!!

 

이제 파이토치로 시작하는 딥러닝 기초 Tensor Manipulation 요약을 시작해보겠습니다!!

 

학습 목표

텐서 조작(Tensor Manipulation)에 대해 알아본다.

핵심키워드

텐서(Tensor)

넘파이(NumPy)

텐서 조작(Tensor Manipulation)

브로드캐스팅(Broadcasting)


1. Vector, Matrix and Tensor

먼저 차원에 대한 것이다. 보통 1차원을 Vector, 2차원을 Matrix,  3차원을 Tensor라고 표현한다.

4차원은 3차원을 위로 쌓은 모양, 5차원은 4차원을 옆으로 쌓은 모양, 6차원은 5차원을 뒤로 쌓은 모양이다.

 

각 data의 크기를 아는 것은 매우 중요하기 때문에 우리가 자주 접하게 될 Matrix와 Tensor의 

크기를 표현하는 방법을 알아보도록 하겠습니다.

 

|t|는 matrix의 크기를 말하며 보통 batch size(세로) X dim(가로)로 표현한다.

 

3차원은 Computer Vision과  Natural Language Processing에서 의미하는 방법이 조금 다르다.

Computer Visiond에서는 batch size(세로) X dim(가로) X height(깊이)와 같이 표현하고

 

Natural Language Processing에서는 batch size(세로) X length(가로) X dim(깊이)로 표현하며

length(가로) X dim(깊이)가 하나의 문장이 되고 이러한 하나의 네모가 batch size만큼 있다는 의미이다.

 

본격적으로 PyTorch에 대하여 알아보기 전에 Numpy에 대해서 간단하게 리뷰해보도록 하겠습니다.

 

2. Numpy Review

   1) 1D Array with NumPy

np.array() : 배열을 선언하는 함수

A. ndim() : 변수의 차원

A. shape() : 변수의 모양(오, 행)

변수를 slicing 하는 것은 파이썬과 유사해 직관적으로 이해할 수 있다.

 

   2) 2D Array with NumPy

 

2차원 배열을 선언하는 것도 1차원 배열을 선언하는 것과 유사하다.

 

3. PyTorch is like NumPy

   1) 1D Array with PyTorch

PyTorch에서는 NumPy와 유사하게 torch.FloatTensor()를 통해 배열을 선언할 수 있다.

배열의 차원, 크기, slicing과 같은 함수 또한 NumPy와 매우 유사하다.

 

   2) 2D Array with PyTorch

2차원 배열 선언 또한 이해하는데 큰 어려움이 없다.

 

   3) Broadcasting

PyTorch에서 정말 중요한 부분이 바로 이 Broadcating이다.

첫 번째 코드와 같이 원래 행렬의 덧셈을 수행할 때는 행렬의 크기가 같아야 한다.

하지만 PyTorch에서는 Broadcating을 통해 Vector x Scalar, 크기가 다른 행렬의 덧셈을 가능하게 해 준다.

두 번째 코드를 보면 알 수 있듯이 [1,2] +[3]은 수학적으로 정의가 되지 않는다. 

그러나 PyTorch에서는 Scalar를 Vector로 바꿔 [1,2] +[3,3]과 같이 덧셈을 하고 있다.

세 번째 코드를 보면 알 수 있듯이 다른 두 Vector를 동일한 크기로 바꿔 덧셈을 하고 있다.

(1x2) + (2x1) =>(2x2) + (2x2)로 바꿔 [[1,2], [1,2]] +[[3,3], [4,4]]로 덧셈을 하고 있다.

 

※ Broadcating으로 인해 오히려 debug를 하는데 문제를 일으킬 수 있으므로 반드시 의도에 맞게 사용해야 한다.

 

   4) Mul vs. Matmul

A.matmul() : 행렬의 곱

A.mul() : 원소들의 곱 (mul의 결과에서 볼 수 있듯이 곱셈에서도 Broadcating이 적용된다.)

 

   5) Mean

A.mean() : 평균을 구하는 함수

A.mean(dim) : dim을 제거하고 평균을 출력

 

예를 들어 dim=0이라 할 때, 이는 첫 번째 차원을 의미하는데 첫번째 차원은 '행'이다. 

즉, 열만 남긴 채 평균을 구한다는 의미로 (2,2)의 행렬을 (,2)로 나타내고자 하는 것이다.

다른 말로 각 '열'의 평균을 구하는 것이다. 

 

   5) Sum 

A.sum() : 합을 구하는 함수

A.sum(dim) :  dim을 제거하고 합을 출력

 

    6) Max and Argmax

A.max() : 원소의 최댓값을 구하는 함수

A.max(dim) :  dim을 제거하고 최댓값과 그 인덱스를 출력

 

예를 들어, dim=1이라 할 때 이는 두 번째 차원을 의미하는 것으로 '열'을 의미한다. 

즉 (2,2)의 행렬을 (2,)로 나타내고자 하는 것이다. 

이때 1과 2를 비교했을 때 2가 더 크고, 3과 4를 비교했을 때 4가 더 크기 때문에 인덱스는 [1,1]인 것이다.

 

   7) View

A.view() : Tensor를 reshape하는 함수

View함수는 딥런닝에서 데이터를 정제하는 데 있어서 매우 중요한 함수이기 때문에 명확하게 이해할 필요가 있다.

위의 코드를 살펴보면 ft는 (2,2,3)의 형태를 띠고 있다. 하지만 이를 두번째 코드를 통해 (4,3)으로 만들고자 한다. 

그 과정을 살펴보면 '-1'의 의미는 너가 알아서 결정해라는 의미이다. 따라서 나는 3열로 만들고 싶어 근데 오는 알아서 결정해줘 이런 말인 것이다. 따라서 (2x2, 3)의 형태가 된 것이다.

세번째 코드를 보면 이는 오는 너가 알아서 결정해! 단, 열은 1열이고 깊이는 3이어야해! 라는 말고 같다. 

따라서 (4,1,3)의 형태를 띠게 된 것이다. 여기서 중요하게 살펴봐야할 점은 결국은 각 차원을 모두 곱하면 12로 동일하다는 것이다. 즉 원소는 변하지 않고 형태만 변하는 것이다.

 

   8) Squeeze

A.squeeze() : 각 차원의 값이 1인 경우 이를 없애라.

View를 이해했다면 Squeeze는 더 쉽게 이해할 수 있다. 위의 코드를 살펴보면 열이 1임을 볼 수 있다. 즉 이렇게 각 차원의 값이 1인 경우 이를 없애는 함수이다.

   9) Unsqueeze

A.unsqueeze(dim) : squeeze와 반대로 해당 하는 차원(dim)에 1을 추가하라는 함수

처음 ft는 크기가 3인 scalar 였다. 하지만 오(dim=0)에 1을 추가하여 (1,3)이 된 것을 볼 수 있다.

이는 view를 통해 똑같이 표현할 수 있는데, 열은 너가 알아서 해줘! 단, 오는 1이어야해! 와 같은  표현이다.

unsqueeze에서 -1은 마지막 차원을 의미하는 것이다. 즉 여기서는 dim=1과 같은 표현이다.

 

  10) Casting

Casting은 말그대로 원소들의 타입을 변경해부는 것이다.

 

  11) Concatenation

A.cat(Tensor,dim) : 서로다른 두 Tensor를 합쳐주는 함수

서로 다른 두 Tensor를 dim의 방향으로 합쳐주는 함수이다.

 

  12) Stacking

A.stack([Tensors],dim) : 크기가 같은 여러 Tensor들을 dim의 방향으로 합쳐주는 함수

이는 cat과 unsqueeze를 통해 똑같이 표현할 수 있다. 먼저, unsqueeze를 통해 (1,2) 로 변경 후 cat을 통해 오방향으로 합쳐준다.

 

   13) Ones and Zeros Like

A.ones_like(Tensor) , A.zeros_like(Tensor) : Tensor의 shape으로 0 또는 1로 채운다.

 

   14) In-place Operation

Tensor.mul(num) : Tensor의 각 원소에 num만큼 곱해준다. 단, Tensor자체가 변하지 않는다.

Tensor.mul_(num) : Tensor의 각 원소에 num만큼 곱해준다. 단, Tensor자체가 변한다.


이상으로 PyTorch의 기본적인 Manipulation에 대하여 정리해보았다.

이렇게 하나하나 정리를 해보는 것이 처음이라

어떻게 해야할지 많이 낯설고 부족하지만 부족한 부분은 채워나가면서 천천히 차근차근 남겨나가고 싶다.

이상으로 모두의 딥러닝 PyTorch 첫번째 강의 정리 끝!!!

 

 

 

반응형