PyTorch basic
PyTorch
- 간편한 딥러닝 API[^1] 제공
- 머신러닝 알고리즘을 구현, 실행하기 위한 확장성이 뛰어난 Multi-platform Interface
PyTorch Architecture
- users -> Top-level API (torch, torch.autograd(자동미분), torch.nn(layer, loss), torch.multiprocessing(병렬 처리), torch.utils(데이터로딩, 모델 저장))
- Python API
- Autograd C++, ATen C++, JIT (Just in Time 동적 컴파일러)
- 성능 최적화, 연산 효율
- Low-level Library
- TH C(텐서 연산), THC CUDA(GPU 텐서 연산), THNN C(신경망 연산), THCUNN CUDA(GPU 신경망 연산)
- GPU 최적화 컴파일러
- Autograd C++, ATen C++, JIT (Just in Time 동적 컴파일러)
What is Tensor?
1. 0-D Tensor: Scalar
- 언어적: 하나의 숫자로 표현되는 양
- 대수적: a = a1, a ∈ ℝ
- 코드
a = torch.tensor(365)
2.1 1-D Tensor: Vector
- 언어적: 수치가 치열 여러개의 숫자로 이루어진 것
- 대수적: b = [b1, b2, …, bn], b ∈ ℝ^n
- 코드
b = torch.tensor([175, 60, 81, 0.8, 0.9])
3. 2-D Tensor: Matrix
- 언어적: 동일한 크기를 가진 1차원 Tensor들이 모여 행과 열로 구성한 구조
- 대수적: c = [[97, 114, 140, 191], [39, …, …, 1]], c ∈ ℝ^(m*n)
- 코드
c = torch.tensor([[97, 114, 140, 191], [39, 45, 78, 1]])
4. 3-D Tensor
- 언어적: 2-D Tensor들이 쌓여서 형성된 입체적 배열 구조
- 코드
d = torch.tensor([[[255,0,0],[0,255,0]], [[0,0,255],[255,255,0]]])
torch.stack([red, green, blue], dim=2)
PyTorch 데이터 타입
dtype: 데이터 유형
정수형
8 | 16 | 32 | 64 | |
---|---|---|---|---|
양수 x | 0~255 | 0~65535 | 0~4294967295 | 0~18446744073709551615 |
음수 0 | -128~127 | -32768~32767 | -2147483648~2147483647 | -9223372036854775808~9223372036854775807 |
부호 X, 8비트
- 연속적 범위: 0~255
- 강제적: 12 = 0 0 0 0 1 1 0 0
- 예: dtype = torch.uint8, a =
torch.tensor([1], dtype=torch.uint8)
부호 O, 8비트
- -128~127, 1비트는 부호에 불림
- -12 = 1 0 0 0 1 1 0 0
- 양수: 00000000 (0)부터 01111111 (127)까지 128개의 숫자 표현
- 음수: 10000000 (-128)부터 11111111 (-1)까지
- dtype =
torch.int8
부호 O, 16비트
- -32,768 ~ 32,767
- dtype =
torch.int16
또는 torch.short
부호 O, 32비트
- 표준적인 정수 크기
- dtype =
torch.int32
또는torch.int
부호 O, 64비트
- dtype = torch.int64 또는 torch.long
2의 보수 표현법
- 양수는 그대로 표현
- 음수는 절대 값에 대한 2의 보수 형태로 표현
- 예: -5 = 0000 0101(1의 보수) -> 1111 1010 (2의 보수)
언제 비트를 줄여서 사용하는가?
- 16비트: 메모리가 제한적인 환경, 정밀도가 낮아도 되는 경우
- 32비트: 일반적인 경우 (메모리 사용량 4바이트)
- 64비트: 매우 큰 값, 높은 정밀도(메모리 사용량 8바이트) 일종의 해상도
고정 소수점
16비트 고정 소수점
- 언어적: 비트를 사용해서 정수부와 소수부로 표현하는 데이터 형식
- 예: 102.5 -> 0110011000000101
- 부호 1비트, 정수부 7비트, 소수부 8비트
Q. 102.005는 어떻게 저장해야 할까?
고정 소수점으로 표현하면 0001 0000 0010 . 0000 0000 0101
- 24비트가 필요함
- 메모리 부족
부동 소수점
32비트 부동 소수점 수
- 32비트로 숫자를 정규화하여 가수부, 지수부로 나누어 표현하는 방식
- 예: 102.5 = 1.025 x 10^2
- 부호 1bit, 지수부 8bit, 가수부 23bit
- dtype =
torch.float32
또는torch.float
64비트 부동소수점 수
- 1비트 부호, 11비트 지수부, 52비트 가수부
- dtype = torch.float64 또는 torch.double
Typecasting
- 메모리 부하를 줄이기 위해 데이터 타입 변경
i = torch.tensor([2, 3, 4], dtype=torch.int8)
j = i.float()
k = i.double()
j: 32비트 부동소수점으로 타입 캐스팅
k: 64비트 부동소수점으로 타입 캐스팅
Tensor 기본 함수 및 메서드
- min, max, sum, prod, mean, var, std
- torch.method(parameter)
- tensorobject.method()
torch.min(a)
a.min()
Tensor 특성 관련 메서드
- dim(), size(), shape, numel()
- tensorobject.method()
a.size()
a.shape
Manipulation of Tensors
1. Tensor의 indexing & slicing
- indexing: Tensor의 특정 위치의 값을 접근하는 것
- slicing: 부분집합 선택하여 새로운 Sub Tensor 생성하는 과정
- 예:
a = torch.tensor([10, 20, 30, 40, 50, 60]) a[0] # 10 a[3] # 40
2-D Tensor의 indexing 예제
b = torch.tensor([[10, 20, 30], [40, 50, 60]])
b[0, 0] # tensor(10)
b[1, 2], b[1, -1] # tensor(60)
2-D Tensor의 slicing 예제
b[0, 1:], b[0, :2] # tensor([20, 30]), tensor([10, 20])
b[1, ...] 또는 b[1, :] 또는 b[1, :-1] # tensor([40, 50, 60])
a[:5:2] # tensor([10, 30, 50])
Tensor의 view를 활용한 모양변경
-
view()
메서드를 활용한 모양변경- Tensor의 메모리가 연속으로 할당된 경우에 사용 가능
- 메모리 주소가 등차수열을 이루는 경우에는 슬라이싱 후에도 view가 가능
c = torch.tensor([[0, 1, 2], [3, 4, 5]]) d = c[:, :2] # tensor([[0, 1], # [3, 4]]) contiguous 속성이 깨짐 s = c[:, :1] #tensor([[1], # [3], # [5]]) # 메모리 연속성이 유지됨(view 가능)
- Tensor의 메모리가 연속으로 할당된 경우에 사용 가능
contiguous 확인 메서드
d.is_contiguous()
# False
d_contiguous = d.contiguous() # 연속적으로 할당 가능
Tensor의 reshaping 예제
reshape()
메서드를 활용한 모양 변경- 장점
- 메모리가 연속적이지 않아도 사용가능
- 안전하고 유연성이 좋음
- 단점
- 성능 저하의 단점
- 예시:
n = torch.arange(12) o = n.reshape((4, 3)) 또는 n.reshape((3, 4))
- 장점
Transpose
- 두 차원의 축을 서로 바꾸는 메서드
m = o.transpose(0, 1) # 0과 1차원의 축을 바꿈 m = o.transpose(1, 2) # 1과 2차원의 축을 바꿈
squeeze()
-
dim = 1인 특정 차원은 축소
u = torch.rand(1, 3, 4) v = torch.squeeze(u) # tensor[(3, 4)] w = torch.randn(1, 1, 4) x = torch.squeeze(w) # tensor(4) x = torch.squeeze(w, dim = 0) # tensor[(1, 4)] t = torch.randn(1, 2, 3, 1) t_squeezed = torch.squeeze(t)
tensor[(2, 3)]
unsqueeze()
-
dim = 1 특정 차원 확장
y = torch.rand(3, 4) z = torch.unsqueeze(y, dim=0) # torch.Size([1, 3, 4]) z = torch.unsqueeze(y, dim=2)
torch.Size([3, 4, 1])
stack()
-
Tensor들의 결합
r = torch.tensor([[255, 0], [0, 255]]) g = torch.tensor([[0, 255], [0, 255]]) b = torch.tensor([[0, 0], [255, 0]]) a = torch.stack((r, g, b)) a = torch.stack((r, g, b), dim = 1) a = torch.stack((r, g, b), dim = 2)
tensor.size[(3, 2, 2)]
tensor.size[(2, 3, 2)]
tensor.size[(2, 2, 3)]
[^1] API(Application Programming Interface)
- 응용 프로그램에서 서로 상호작용하는 데 사용하는 명령어, 함수, 프로토콜의 집합
댓글남기기