SooHyun2i 2021. 1. 22. 21:54

가짜연구소(Pseudo Lab) 시즌2 Study를 01.16(토) ~ 04.14(토) 일정으로 진행하게 되었습니다.

 

모두가 한걸음씩 성장하는 pytorch라는 주제로

 

모두를 위한 딥러닝 시즌 2 Pytorch 편을 빠르게 진행하고

Pytorch를 이용한 객체 탐지 (Object Detection)( 의료용 마스크 탐지), 시계열 분석 (Time Series)(코로나 확진자 수 예측)

이 2가지를 진행하는 것이 목표입니다..ss

 

먼저 1주차 Lab-01 내용인 Tensor Manipulation 1,2 를 정리해보려고 합니다..

 

Tensor Manipulation 1

 

딥 러닝을 위한 가장 기본적인 수학적 지식인 Vector, Matrix, and Tensor에 대해 설명하고 다루는 방법을 익힙니다.

 

PyTorch는 Python 패키지인 NumPy와 유사하므로 간단한 Review 또한 합니다.

 

Tensor의 선언 방법에 대해 설명합니다.

 

행렬의 곱은 일반 곱과 계산하는 방법이 다릅니다. 이에 대해 설명합니다.

 

다른 기본적인 Operation에 대해 간단히 실습하고 설명합니다.

 

 


Vector, Matrix and Tensor

딥 러닝을 하게 되면 다루게 되는 가장 기본적인 단위인 Vector, Matrix, Tensor 입니다.

그림으로 이해하면 쉽습니다. 일반적으로 저희는 3D까지만 생각해봤지만 4D 이후부터도 3D를 하나의 1D처럼 생각하고 쌓는 개념으로 생각하면 쉽다고 생각합니다.

 

1D는 벡터(크기와 방향이 있음), 차원이 없으면 스칼라(위의 그림에는 없음)라고 합니다.

2D는  Matrix 형태이며 3차원은 Tensor라고 부릅니다.

 

그림에서 행의 크기 즉 세로가 batch size, 열의 크기가 dim으로 표현합니다. 보통 batch는 64, dim 은 256을 많이 사용합니다. 

 

Computer VIsion 에서 특히 이미지 처리분야에서는 3D를 주로 다룬다. 이미지라는 것은 가로, 세로라는 것이 존재합니다. 이게 여러 장의 이미지가 있으면 즉 batch size로 구성하게 되면 위의 그림과 값이 3차원 Tensor가 됩니다.

NLP 분야에서도 마찬가지로 3D Tensor가 사용됩니다. 보통 (batch size, 문장 길이, 단어 벡터의 차원) 이렇게 3차원 Tensor로 사용합니다.

 


NumPy Review

 

Numpy로 배열을 만드는 내용입니다. 너무 쉬운 내용이지만 간단히 설명하고 넘어가자면 numpy를 이용해

array 형태로 선언하고 이를 리스트 슬라이싱 처럼 이용해서 원하는 배열의 요소를 구할 수 있습니다.

 

n.dim은 배열의 Rank를 의미합니다. 위의 예시는 2차원 즉 행렬의 형태이므로 Rank는 2입니다. shape는 배열의 모양입니다. 위의 예시는 4행3열의 2차원 형태의 행렬임을 알 수 있습니다.

 

PyTorch Tensor

 

PyTorch를 이용해 1차원 벡터를 만드는 예시 입니다. 

Numpy와 똑같습니다. ndim -> dim 으로 바뀌었습니다.

2D Array 입니다. 앞의 Float은 안의 element의 type을 의미합니다. 

 

Pytocrh tensor를 다루는 방법 중 하나인 Broadcasting입니다. 

사칙연산인 +, - 할 때 두 Tensor의 크기 즉 shape는 같아야 합니다. 곱셈도 마찬가지입니다.

Broadcasting는 자동으로 사이즈를 맞춰주는 역할을 합니다. 

 

위의 예시를 보면 m1은 2차원 Matrix의 형태이고 m2는 1차원 Vector 형태입니다. 

Broadcasting기능으로 자동으로 사이즈를 맞춰주기 위해 덧셈을 하면 m2 는 [[3,3]]형태로 계산이 됩니다.

 

강의에서는 Broadcasting을 조심해서 사용해야 한다고 설명합니다. 그 이유는 tensor나 데이터가 복잡해질 경우 Error의 원인을 못 찾는 경우가 생길 수 있다고 합니다. 


Multiplication vs Matrix Multiplication

 

딥러닝은 행렬의 곱 연산을 많이 사용합니다. 일반적인 기존의 곱셈은 두 matrix size가 같아야 합니다..

이 예제는 곱셈과 행렬의 곱 차이를 보여줍니다.

 

Mean과 Sum 관련된 예제와 설명도 나오는데 쉽고 간단하므로 생략하겠습니다. 

 

Max and Argma

x

Max는 말 그대로 matrix에서 max 원소 값을 return 해줍니다. 

Argmax는 그 값이 아닌 index값을 return 해주는 기능입니다. dim=0이면 1행 dim=1 이면 2행으로 생각하면 됩니다. 

 


View (Reshape)

 

말 그대로 tensor의 모양을 다시 만들어준다고 생각하면 됩니다. 

 

정확히 view는 원소의 수를 유지하면서 텐서의 크기 변경 하는 기능입니다. 매우 중요하다고 합니다.

 

이 부분은 예제를 조금 자세히 설명하려고 합니다.

먼저 ft.view([-1,3]) 이 부분을 살펴봅니다. -1은 첫번째 차원은 사용자는 잘 모르겠으나 pytorch에게 맡긴다고 생각하면 됩니다. 3은 차원의 길이를 3으로 한다는 의미입니다. 다시 말해 3차원을 2차원 텐서로 변경하되 (?,3)의 크기로 변경하라는 의미입니다. 개수는 똑같아야 하므로 (4,3)이 되야 합니다. 

 

  • view는 기본적으로 변경 전과 변경 후의 텐서 안의 원소의 개수가 유지 되어야 합니다.

  • Pytorch의 view는 사이즈가 -1로 설정되면 다른 차원으로 해당 값을 유추합니다.

이렇게 2가지로 규칙을 정리해보았습니다. 

 

이번에는 3차원 tensor를 차원은 그대로 3차원으로 유지해주되 shape를 바꿔보려고 합니다. (2*2*3) tensor를 (?*1*3)으로 바꾸려면 ?는 4가 됩니다. 이런 식으로 생각해주면 됩니다.

 

Squeeze

Squeeze는 말 그대로 쥐어 짜는 것이라고 생각하면 됩니다. View와 다른 점은 자동으로 차원의 element 개수가 1이면  없애줍니다. 예를 들어 위와 같이 (3,1) 이면 -> (3)으로 squeeze한 결과를 볼 수 있습니다.

UnSqueeze도 있는데 반대입니다. Unsqueeze를 사용 할 때는 dim을 명시해줘야 되는데 거기에 1을 넣어줍니다.  

 

Type Casting

 

 

Concatenate

두개의 tensor를 연결하는 concatenate입니다. 여기서 dim이 중요합니다. dim=0은 1번째 차원을 늘리라는 의미입니다. 2*2 와 2*2인데 1번째 차원을 늘리므로 4*2가 되었습니다. dim=1은 2번째 차원을 늘리라는 의미입니다.

2*4가 되었습니다.

 

* 딥러닝에서는 주로 모델의 입력 또는 중간 연산에서 두 개의 tensor를 연결하는 경우가 많습니다. 두 tensor를 연결한다는 것은 두 가지의 정보를 모두 사용한다는 의미를 가지고 있습니다.

 

Stacking

Stacking은 연결을 하는 ㅏㅓ또 다른 방법 중 하나입니다. 영어 뜻대로 쌓는다는 의미입니다. 

이 부분은 예제를 설명하자면 3개의 tensor를 만듭니다. 

3개의 tensor를 쌓으면 다음 그림과 같습니다.

stack는 많은 연산을 포함하고 있습니다. 

마지막 줄 예제를 살펴보겠습니다. unsqueeze(0) 을 했으므로 (2, ) tensor들이 (1,2)로 바뀝니다. 

여기에 이제 concatenate하는 cat 함수를 쓰면 stack과 똑같은 연산을 합니다.

 

stack을 진행할때 위와 같이 dim을 정해주면 증가하는 차원이 변하게 됩니다.

 

ones_like와 zeros_like는 크기가 똑같은 tensor를 0이랑 1로 채워진 새로운 tensor로 만드는 함수입니다.

 

이상으로 Lab1 정리를 마칩니다.

 

Reference

Youtube : www.youtube.com/playlist?list=PLQ28Nx3M4JrhkqBVIXg-i5_CVVoS1UzAv

강의 자료 : deeplearningzerotoall.github.io/season2/lec_pytorch.html