티스토리 뷰

안녕하세요? 오늘은 Pytorch가 무엇인지 알아보고자 합니다.


Pytorch란 다음 두 가지를 목표로하는 과학 연산 패키지 파이썬입니다.


1. GPU 연산을 사용하기 위한 Numpy 대체물입니다.


2. 속도와 유연성을 극대로 한 딥러닝 연구 플랫폼입니다.


한 문장으로 정리하자면 기존 수치 연산 라이브러리인 Numpy를 딥러닝 연구 목적으로 GPU에서도 사용하고자 탄생한 속도와 유연성을 극대로 한 딥러닝 플랫폼입니다.


자 그럼 먼저 Tensor란 무엇일까요?


Tensor란 Numpy의 다차원 배열인 ndarray와 유사합니다. 그렇지만 Tensor는 연산의 속도를 극대화시키기 위해 GPU에서도 사용이 가능합니다.


그럼 Tensor에 대해 직접 코드를 쳐가며 살펴보겠습니다.


사용할 라이브러리들을 import 하겠습니다.



1. Python version 3.x 와 2.x의 print의 format을 맞춰주기 위함입니다. (Python 2.x에서는 print 'x'가 가능하지만 3.x에서는 불가능합니다.)

따라서 print_function을 import 해줌으로써 3.x와 2.x의 print 형식을 함수 print() 취급하도록 합니다.

2. pytorch를 사용하기 위해 torch를 import 합니다.


이번에는 다양한 방법으로 tensor(=matrix)를 생성해보겠습니다.


[방법1]

1. torch.empty()는 5x3 matrix를 구성하면서 초기화되지 않은 데이터로 값을 채움을 의미합니다.

2. x를 출력합니다.


[방법2]

1. torch.rand()함수를 사용하여 5x3 matrix를 구성하면서 [0, 1]사이의 임의의 값으로 초기화하였습니다.

2. 값을 출력합니다.


 [방법3]

1. torch.zeros()함수를 사용해서 5x3의 matrix를 구성하되, data type은 torch.long 타입으로 구성합니다.

2. 값을 출력합니다.


[방법4]

이번에는 값을 지정해서 주는 방법입니다.

1. torch.tensor() 함수를 사용하여 값을 지정하였습니다.

2. 값을 출력합니다.


[방법5]

이번에는 기존 tensor를 기반으로 같은 구조를 가진 tensor를 생성하는 방법입니다.

1. new_ones()를 통해 5x3의 값이 1로 채워진 tensor를 torch.double 타입으로 생성합니다.

2. 값을 출력합니다.

4. torch.randn_like()함수를 통해 x와 같은 크기인 5x3의 tensor를 구성하되, data type은 torch.float으로 합니다.

5. 값을 출력합니다.


사이즈를 확인해보겠습니다.

1. size() 함수를 사용하여 tensor x의 크기를 확인합니다.


이번에는 tensor 연산 방법입니다.


더하기 연산부터 살펴보겠습니다.

[방법1]


1. torch.rand()함수를 사용하여 5x3의 tensor를 구성하고

2. x + y를 더하여 출력합니다.


[방법2]

1. torch.add() 함수를 사용하여 tensor x와 y를 더하여 출력합니다.


[방법3]

1. torch.empty()를 사용하여 5x3의 초기화되지 않은 값이 채워진 tensor를 생성합니다.

2. torch.add()함수를 사용하여 x, y를 더하되 매개변수 out에 result를 넘겨주어 출력값을 result에 넣습니다.

3. 값을 출력합니다.


[방법4]

1. tensor의 멤버함수인 add_()을 사용하여 y에 x를 더하여 y에 저장합니다.

2. 값을 출력합니다.


tensor는 numpy와 같은 indexing 접근 방식을 지원합니다.

1. tensor x의 두 번째 열을 출력합니다.


이번에는 torch의 shape을 바꾸는 방법에 대해 알아보겠습니다.

1. torch.randn()함수를 사용하여 4x4의 tensor를 생성합니다.

2. tensor x의 크기를 16으로 변환하여 y에 저장합니다.

3. tensor x의 크기를 -1x8으로 변환하여 z에 저장합니다. 이때 '-1'의 의미는 현재 값을 다른 값에 의해 계산하겠다는 의미입니다.

4. 각 사이즈를 출력합니다.


이번에는 하나의 element를 가져오는 item()함수에 대해 알아보겠습니다.

1. torch.randn()을 사용하여 사이즈 1인 tensor를 생성하여 x에 저장합니다.

2. x를 출력합니다.

3. x의 값을 item() 함수를 사용해 가져와 출력합니다.


Pytorch는 'NumPy Bridge'를 지원합니다.


Numpy Bridge란 tensor와 numpy가 같은 메모리를 공유함으로써 어느 한 값이 바뀌면 참조하고 있는 다른 값도 바뀌게 됨을 의미합니다.

자 코드를 보시죠

1. torch.ones()를 사용하여 크기가 5이며 값이 1인 tensor a를 생성하였습니다.

2. a를 출력합니다.


1. a를 numpy로 변환하여 b에 저장합니다.

2. b를 출력합니다.


1. add_() 함수를 사용하여 a에 1을 더하여 a에 저장합니다.

2. a를 출력합니다.

3. b를 출력합니다. 이때, NumPy Bridge로 인해 numpy b 의 값이 바뀐 것을 확인할 수 있습니다.


Pytorch에서 tensor와 numpy의 변환은 매우 간단합니다.

1. numpy를 np로 import합니다.

2. numpy 타입의 사이즈가 5, 값이 1인 배열을 생성합니다.

3. torch.from_numpy() 함수를 통해 이 numpy 타입의 배열 a를 tensor로 읽어들여 b에 저장합니다. 

4. np.add() 함수를 통해 a에 1를 더하고 out 매개변수에 a를 넘겨줌으로써 출력값을 a에 저장합니다.

5. a를 출력합니다.

6. b를 출력합니다.


자, 오늘 배운 내용을 나열해보겠습니다.

1. Pytorch가 무엇인지?

2. Tensor가 무엇인지?

3. Tensor 생성 방법

4. Tensor 연산 방법

5. Tensor indexing 접근 방법

6. Tensor shape 바꾸는 방법

7. Tensor element 가져오는 방법

8. NumPy Bridge

9. Tensor에서 NumPy로, NumPy에서 Tensor로의 변환 방법


이상으로 오늘의 포스팅을 마치겠습니다.


감사합니다.


자료 소스: https://pytorch.org/tutorials/ 

댓글