[U] Week 2 - PyTorch

JaeJun Lee ·2022년 9월 27일
0

부스트캠프 AI Tech

목록 보기
10/30

PyTorch

Facebook 인공지능 연구팀이 개발한 Deep learning framework으로 다음과 같은 특징을 가진다.

  • Numpy 구조를 가지는 Tensor 객체로 array를 표현

  • 자동미분을 지원하여 DL 연산을 지원

  • 다양한 형태의 DL을 지원하는 함수와 모델을 지원

  • Release

    • Stable: 장기적으로 유지되며 이전 버전과의 호환성이 유지되는 상태
    • Beta: API가 사용자 피드백에 따라 변경될 수 있고 성능을 개선해야 하거나 운영자 전반에 걸친 적용이 아직 완료되지 않은 상태
    • Proto type: 런타임 플래그 뒤에 있는 경우를 제외하고 일반적으로 PyPI 또는 Conda와 같은 바이너리 배포판의 일부로 사용할 수 없으며 피드백 및 테스를 위한 초기 단계인 상태

Computational Graph

연산의 과정을 그래프로 표현한다: g=(x+y)zg=(x+y)*z
Define and Run: 그래프를 먼저 정의 -> 실행시점에 데이터 feed (Tensorflow)

  • production과 scalability의 장점을 가진다

Define by Run: 실행을 하면서 그래프를 생성하는 방식 (PyTorch)

  • 즉시 확인이 가능한 pythonic code
  • 사용하기가 편하다

Tensor

Tensor 생성은 list나 ndarray를 사용 가능하다.

  • 다차원 Arrays를 표현하는 PyTorch 클래스
  • 사실상 numpy의 ndarray와 동일 (TensorFlow의 Tensor와도 동일)
  • Tensor를 생성하는 함수도 거의 동일
  • tensor가 가질 수 있는 data 타입은 numpy와 동일하지만 tensor는 GPU를 사용할 수 있다
  • 사용법은 numpy의 사용법이 대부분 그대로 적용된다
# numpy
import numpy as np
n_array = np.arange(10).reshape(2, 5)
print("ndim :", n_array.ndim, "shape :", n_array.shape) 

# pytorch
import torch
t_array = torch.FloatTensor(n_array)
print("ndim :", t_array.ndim, "shape :", t_array.shape) 

# data to tensor
data = [[3, 5], [10, 5]]
x_data = torch.tensor(data)

# ndarray to tensor
nd_array_ex = np.array(data)
tensor_array = torch.from_numpy(nd_array_ex)

# use GPU
x_data.device
# device(type='cpu')

if torch.cuda._is_available():
	x_data_cuda = x_data.to('cuda')

X_data_cuda.device
# device(type='cuda', index=0)

Tensor handling

  • view: reshape과 동일하게 tensor의 shape을 변환하고 입력 데이터에 주소 공간을 그대로 사용
  • reshape: tensor의 shape를 변환하고 contiguous가 보장되지 않고 깨지는 순간 데이터를 copy해서 새로운 주소 공간을 할당
    • contiguous: 바로 옆에 있는 요소가 실제 메모리 공간 상에서 인접해 있는지
  • squeeze: 차원의 개수가 1인 차원을 삭제(압축)
  • unsqueeze: 차원의 개수가 1인 차원을 추가
  • mm: 행렬곱셈 연산 (boradcasting 지원 X)
  • matmul: 행렬곱셈 연산 (boradcasting 지원)
  • dot: 스칼라 혹은 벡터 곱셈 연산
  • nn.functional 모듈을 통해 다양한 수식 변환을 지원
  • linalg: 선형대수학(Linear Algebra) 관련 기능
  • norm: 벡터 or 행렬 내적
  • vector_norm: 벡터 내적
  • matrix_norm: 행렬 내적
  • tensor: 함수이고 입력 데이터가 주어져야 하며 dtype도 입력 데이터에서 유추하여 정해진다.
  • Tensor: 클래스이고 생성 시 기본적으로 dtype이 FloatTensor로 정해지며 empty tensor를 생성하는 것이 가능
  • add: + 연산
  • mul: ×\times 연산
  • divide: / 연산
  • sub: - 연산
  • gather: 차원을 지정하여 다차원 텐서에서 대각선 요소를 가져오는 것이 가능
  • is_tensor: tensor 자료형 확인
  • is_storage: storage object 자료형 확인
  • numel: tensor 크기 구하기(요소 개수)
  • from_numpy: numpy array to tensor
  • zeros: 요소가 0인 tensor 생성
  • zeros_like: 입력 텐서와 동일한 shape을 가지며 모든 요소가 0인 tensor 생성
  • chunk: 지정 개수로 tensor를 분리
  • swapdims: 두 개의 axis 축을 전환, swapaxes와도 유사하며 torch.transpose의 별칭으로도 사용
  • scatter: 새롭게 구성한 tensor의 원하는 index에 맞게 값을 할당
  • rand: 지정 shape의 0~1사이 random 값으로 tensor 생성
  • rand_like: 입력 데이터와 동일한 shape을 가지며 모든 요소가 0~1인 tensor 생성
  • randint: low, high, size를 지정하여 지정 구간 사이 random int 값을 가지는 tensor 생성
  • abs: tensor의 절댓값
  • ceil: tensor의 자릿수 내림
  • exp: tensor의 자연로그
  • einsum: 다양한 연산에 대한 통일된 표기법을 사용하여 tensor 연산이 가능
  • addmm: output=βinput+α(mat1@mat2)output = \beta input + \alpha(mat1 @ mat2)
  • eye: 지정 크기의 단위 행렬 생성
  • linalg.matrix_rank: 2차원 tensor의 숫자 순위 반환

PyTorch의 핵심은 자동 미분의 지원이다 -> backward 함수 사용.

w = torch.tensor(2.0, requires_grad=True)
y = w**2
z = 10*y + 25
z.backward()
w.grad
# tensor(40,)

torch.nn

model 사용 시 W,bW, b 초기화 및 업데이트에 사용하는 함수는 다음과 같은 특징을 가진다.

  • Parameter: gradient 계산, 값 업데이트, 모델 저장 시 값 저장
  • Tensor: gradient 계산 X, 값 업데이트 X, 모델 저장 시 값 저장 X
  • Buffer: gradient 계산 X, 값 업데이트 X, 모델 저장 시 값 저장

nn.Module 상속 시 슈퍼클래스 생성자 혹은 초기화가 자동으로 호출되지 않으므로 nn.Module 클래스 자체가 초기화되도록 super() 호출이 명시적으로 필요하다.

super({class_name}, self).__init__()
# python 3
super().__init__()
  • nn.Sequential: 모듈(Module)들을 하나로 묶어 순차적으로 실행시키고 싶을 때 사용
  • nn.ModuleList: 모듈들을 모아두고 list처럼 인덱싱(indexing)을 통해 사용
  • nn.ModuleDict: 모듈들을 모아두고 dict처럼 key값을 이용해 보관 및 사용
  • children: 한 단계 아래의 submodule까지만 표시
  • named_children: module 및 이름 표시
  • modules: 자신에게 속하는 모든 submodule들을 표시
  • named_modules: module 및 이름 표시
  • model.get_submodule({layer_name}{function_name}): 모듈에 속해있는 서브모듈 가져오기

Reference

0개의 댓글