인공지능/PyTorch

파이토치(PyTorch) 기초 한 번에 part1

해리누나 2023. 6. 3. 00:45
728x90
반응형

해당 글은 이수안 컴퓨터 연구소의 파이토치 한번에 끝내기 PyTorch Full Tutorial Course 의 강의 자료를 정리한 글입니다.

파이토치(PyTorch)란

  • 페이스북이 초기 루아(Lua) 언어로 개발된 토치(Torch)를 파이썬 버전으로 개발하여 2017년도에 공개
  • 초기에 토치(Torch)는 넘파이(NumPy) 라이브러리처럼 과학 연산을 위한 라이브러리로 공개
  • 이후 GPU를 이용한 텐서 조작 및 동적 신경망 구축이 가능하도록 딥러닝 프레임워크로 발전시킴
  • 파이썬답게 만들어졌고, 유연하면서도 가속화된 계산 속도를 제공

 

파이토치의 구성요소

  • torch: 메인 네임스페이스, 텐서 등의 다양한 수학 함수가 포함
  • torch.autograd: 자동 미분 기능을 제공하는 라이브러리
  • torch.nn: 신경망 구축을 위한 데이터 구조나 레이어 등의 라이브러리
  • torch.multiprocessing: 병럴처리 기능을 제공하는 라이브러리
  • torch.optim: SGD(Stochastic Gradient Descent)를 중심으로 한 파라미터 최적화 알고리즘 제공
  • torch.utils: 데이터 조작 등 유틸리티 기능 제공
  • torch.onnx: ONNX(Open Neural Network Exchange), 서로 다른 프레임워크 간의 모델을 공유할 때 사용

 

텐서(Tensors)

  • 데이터 표현을 위한 기본 구조로 텐서(tensor)를 사용
  • 텐서는 데이터를 담기위한 컨테이너(container)로서 일반적으로 수치형 데이터를 저장
  • 넘파이(NumPy)의 ndarray와 유사
  • GPU를 사용한 연산 가속 가능

 

  • 텐서를 사용하기 위해 torch 라이브러리를 import 해준다.
  • .__version__을 통해 현재 사용하고 있는 torch의 버전을 알 수 있다.

 

텐서 초기화와 데이터 타입

 

 

 

데이터 타입(Data Type)

 

이렇게 기존 Tensor의 타입을 다른 타입으로 바꿔주는 것을 타입 캐스팅이라 한다.

 

 

다차원 텐서 표현

 

 

 

 

 

텐서의 연산(Operations)

  • 텐서에 대한 수학 연산, 삼각함수, 비트 연산, 비교 연산, 집계 등 제공

 

 

max와 min은 dim 인자를 줄 경우 argmax와 argmin도 함께 리턴

  • argmax: 최대값을 가진 인덱스 위치
  • argmin: 최소값을 가진 인덱스 위치

 

torch.add: 덧셈

 

1. 결과 텐서를 인자로 제공할 수 있다.

 

2. in-place 방식

  • in-place방식으로 텐서의 값을 변경하는 연산 뒤에는 _''가 붙음
  • x.copy_(y), x.t_()

  • 연산 뒤에 '_'가 붙으면 연산한 값을 저장해준다 라는 뜻이다.
  • 위의 예시에선 tensor y에 tensor x가 더해진 값이 tensor y에 저장된 것.

 

torch.sub: 뺄셈

 

torch.mul: 곱셈

 

torch.div: 나눗셈

 

torch.mm: 내적(dot product)

  • matmul을 줄여서 mm으로 써 사용할 수 있다.
  • svd(singular value decomposition)는 주어진 행렬의 특이값 분해를 계산한다.
  • svd는 namedtuple (U, S, V)로 표현된다.

 

 

텐서의 조작(Manipulations)

인덱싱(Indexing): NumPy처럼 인덱싱 형태로 사용가능

 

view: 텐서의 크기(size)모양(shape)을 변경

  • 기본적으로 변경 전과 후에 텐서 안의 원소 개수가 유지되어야 함
  • -1로 설정되면 계산을 통해 해당 크기값을 유추

4 x 5 행렬은 쭉 flatten 한다면 20개의 요소가 됨. 따라서 결과로 20개가 연달아 있는 형태로 모양이 변경되었다.

 

행렬의 행의 개수를 5로 늘린 모양으로 -1은 비어있는 곳에 값들을 알아서 채워달라는 것을 의미한다.

 

 

item: 텐서에 값이 단 하나라도 존재하면 숫자값을 얻을 수 있음

 

⚠ : 스칼라값 하나만 존재해야 item() 사용이 가능하다.

값이 2개니 error

 

 

squeeze: 차원을 축소(제거)

3차원의 텐서가 2차원의 텐서가 되었다.

 

unsqueeze: 차원을 증가(생성)

dim = 0: 첫 번째 차원을 기준으로 unsqueeze (차원을 늘려줘) 해줘.

 

dim = 2 일시

 

stack: 텐서간 결합

  • 'stack' : 쌓는다 라는 개념
  • tensor x, tensor y, tensor z 3개의 tensor가 하나의 tensor로 결합되었다.

 

 

cat: 텐서를 결합하는 메소드(concatenate)

  • 넘파이의 stack과 유사하지만, 쌓을 dim(차원정보)이 존재해야함
  • 해당 차원을 늘려준 후 결합

텐서 a와 텐서 b를 첫 번째 차원(dim = 0) 을 기준으로 합함.

(각 텐서의 첫 번째 차원이 1 이었으니 1 + 1 = 2라 텐서 c의 사이즈가 [2, 3, 3]

 

dim = 1, 2일 때

이렇듯 concatenate를 통해 우리가 원하는 차원을 기준으로 텐서끼리의 결합이 가능하다.

 

 

chunk: 텐서를 여러 개로 나눌 때 사용 (몇 개로 나눌 것인가?)

tensor를 3개의 텐서로 나눠주는데, 나눌 때의 기준은 1번째 차원으로 하겠다.

 

dim = 0 일 때

 

split: chunk와 동일한 기능이지만 조금 다름 (텐서의 크기는 몇인가?)

  • chunk는 텐서를 몇 개로 나눌지에 대한 정보를 주어야 하는 반면, split는 텐서의 크기를 무엇으로 나눌 것인지, 즉 그 준 크기에 따라서 텐서가 나눠진다.
  • 위 예시에선 1번째 차원을 기준으로 텐서의 크기가 3을 가진 텐서들로 나눠짐.

 

torch ↔ numpy

  • torch에 있는 값을 numpy로, numpy에 있는 값을 torch로 변환할 수 있다.
  • Torch Tensor(텐서)를 NumPy array(배열)로 변환 가능
    • numpy()
    • from_numpy()
  • Tensor가 CPU상에 있다면 NumPy 배열은 메모리 공간을 공유하므로 하나가 변하면, 다른 하나도 변함

텐서가 배열의 형태로 변환됨. (numpy는 데이터 표현에 기본단위로 배열을 사용한다.)

 

a에 반영시켰더니 numpy로 바꾼 b도 메모리에 공유되었기 때문에 값이 바뀐다.

 

a를 넘파이로 선언

b는 이를 torch 형태로 바꾼 것.

torch와 numpy가 메모리를 공유하니 마찬가지로 두 값 모두 변경되어 있다.

GPU는 별도의 메모리가 있어 Tensor가 CPU상에 있을 때만 가능하다.

 

 

 

728x90
반응형

'인공지능 > PyTorch' 카테고리의 다른 글

파이토치(PyTorch) 기초 한 번에 part2  (0) 2023.06.03