PyTorch 설치,
데이터 표현을 위한 기본 구조
- 다차원 배열을 처리하기 위한 데이터 구조
Numpy의 ndarry와 같음
scalar = 0차원 텐서
vector = 1차원 텐터
-> [1,2]
matrix = 2차원 텐서
-> [[1,2], [3,4]]
Tensor = 3차원 이상의 텐서
-> [[[1,2]], [[3,4]]]
...
코딩할 땐, 대괄호의 수로 차원의 수를 확인
차원과 관계 없이 파이토치에서의 type은 모두 torch.Tensor
print(x.ndim) # 텐서 x의 차원 정보 출력
print(x.shape) # 텐서 x의 모양 정보 출력
print(x.dtype) # 텐서 x의 데이터타입 정보 출력
print(x.device) # 텐서 x의 device 정보 출력
print(x.item()) # 텐서 x의 실제 값을 출력; Scalar 형태여야만 가능
2-1) 초기화되지 않은 텐서 생성
x = torch.empty(3, 3) # 3x3
2-2) random한 값이 할당된 텐서 생성
x = torch.rand(3, 3) # 3x3
2-3) 모든 값이 0인 텐서 생성
x = torch.zeros(3, 3) # 3x3
2-4) 모든 값이 1인 텐서 생성
x = torch.ones(3, 3) # 3x3
2-5) 대각성분만 값이 1이 할당된 텐서 생성
x = torch.eye(3, 3) # 3x3
2-6) 사용자가 입력한 값이 할당된 텐서 생성
x1 = torch.tensor([3, 1.1]) # 1차원 텐서; default: 실수형
x2 = torch.tensor([[1, 1], # 2차원 텐서
[2, 2]])
x3 = torch.tensor([[[1, 1], # 3차원 텐서
[2, 2],
[3, 3]],
[[1, 1],
[2, 2],
[3, 3]],
[[1, 1]
[2, 2]
[3, 3]]])
2-7) numpy array로 텐서 생성
import numpy as np
x = np.array([[1, 1],
[2, 2]]) # 2x2 numpy array.
x1 = torch.from_numpy(x) # array -> tensor
x2 = x1.numpy() # tensor -> array
3.1) 데이터 타입 설정
3.1.1) Float형
ft1 = torch.FloatTensor([[1, 2],
[3, 4]])
ft2 = torch.tensor([[1, 2],
[3, 4]], dtype=torch.float)
3.1.2) Long형
lt1 = torch.LongTensor([[1, 2],
[3, 4]])
lt2 = torch.tensor([[1, 2],
[3, 4]], dtype=torch.long)
3.1.3) Byte형
bt1 = torch.ByteTensor([[1, 0],
[0, 1]])
bt2 = torch.tensor([[1, 0],
[0, 1]], dtype=torch.uint8)
3.2) 데이터 타입 설정 방법
##############################
Data type dtype CPU tensor GPU tensor
32-bit floating point torch.float32 or torch.float torch.FloatTensor torch.cuda.FloatTensor
64-bit floating point torch.float64 or torch.double torch.DoubleTensor torch.cuda.DoubleTensor
16-bit floating point torch.float16 or torch.half torch.HalfTensor torch.cuda.HalfTensor
8-bit integer(unsinged) torch.uint8 torch.ByteTensor torch.cuda.ByteTensor
8-bit integer(singed) torch.int8 torch.CharTensor torch.cuda.CharTensor
16-bit integer(signed) torch.int16 or torch.short torch.ShortTensor torch.cuda.ShortTensor
32-bit integer(signed) torch.int32 or torch.int torch.IntTensor torch.cuda.IntTensor
64-bit integer(signed) torch.int64 or torch.long torch.LongTensor torch.cuda.LongTensor
##############################
3.3) 데이터 타입 변환
3.3.1) float to long
ft1.long()
3.3.2) long to float
lt1.float()
x = torch.rand(3, 3) # 3x3 텐서 생성
x.to('cpu') # 텐서 x의 device를 cpu로
x.to('gpu') # 텐서 x의 device를 gpu로
5.1) Operations
a = torch.FloatTensor([[1, 2],
[3, 4]])
b = torch.FloatTensor([[2, 2],
[2, 2]])
a + b # 더하기; == torch.add(a, b) == a.add(b)
a - b # 빼기; == torch.sub(a, b) == a.sub(b)
a * b # 곱하기; == torch.mul(a, b) == a.mul(b)
a / b # 나누기; == torch.div(a, b) == a.div(b)
a ** b #제곱 == torch.pow(a, b) == a.pow(b)
a == b
a != b
a = torch.FloatTensor([[1.1, -2],
[3, 4]])
# 아래 연산을 하면, 하나의 값만 스칼라 형태로 출력됨.
torch.abs(a) # 절대값
torch.ceil(a) # 올림
torch.floor(a) # 내림
torch.min(a) # 최소
torch.max(a) # 최대
torch.mean(a) # average
torch.std(a) # standard deviation
torch.sum(a) # sum
5.2) Inplace Operations(연산 뒤에 _ 를 붕여줌)
5.3) Broadcast in Operations
파이토치에서는 size가 서로 다른 텐서 간에도 사칙연산을 할 수 있도록, 자동으로 차원을 맞춘 후 연산 수행(Broadcast 기능)
5.3.1) 기본형(size가 같은 데이터간 연산)
x = torch.FloatTensor([[1, 2]]) # (1x2)
y = torch.FloatTensor([[3, 4]]) # (1x2)
z = x + y
5.3.2) Tesor + Scalar
x = torch.FloatTensor([[1, 2]])
y = 1
z = x + y
5.3.3) Tensor + Vector
x = torch.FloatTensor([[1, 1],
[1, 1]])
y = torch.FloatTensor([2, 2])
z = x + y
5.3.4) Tensor + Tensor
x = torch.FloatTensor([[1, 1]]) # (1x2)
y = torch.FloatTensor([[2], # (2x1)
[2]])
z = x + y
5.4) masked_fill
x = torch.FloatTensor([[1, 2],
[2, 1]])
y = 2
z = x.masked_fill(mask=(x*y > 2), value=100) # (x*y 값이 2보다 큰 경우), 그 값을 value로 채워라