1. Pytorch basic

Jae Gyeong Lee·2024년 3월 10일

PyTorch 설치,

1. Tensors(텐서)

  • 데이터 표현을 위한 기본 구조
    - 다차원 배열을 처리하기 위한 데이터 구조

  • Numpy의 ndarry와 같음

  • scalar = 0차원 텐서

  • vector = 1차원 텐터
    -> [1,2]

  • matrix = 2차원 텐서
    -> [[1,2], [3,4]]

  • Tensor = 3차원 이상의 텐서
    -> [[[1,2]], [[3,4]]]
    ...

  • 코딩할 땐, 대괄호의 수로 차원의 수를 확인

  • 차원과 관계 없이 파이토치에서의 type은 모두 torch.Tensor

2. 텐서의 속성(Attribute)

  • 텐서의 shape, datatype, 어떤 device에 저장되는지를 의미
print(x.ndim)   # 텐서 x의 차원 정보 출력
print(x.shape)  # 텐서 x의 모양 정보 출력
print(x.dtype)  # 텐서 x의 데이터타입 정보 출력
print(x.device) # 텐서 x의 device 정보 출력
print(x.item()) # 텐서 x의 실제 값을 출력; Scalar 형태여야만 가능

2. 텐서 생성

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. 텐서의 데이터 타입 설정

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()

4. 텐서 device 변환

x = torch.rand(3, 3) # 3x3 텐서 생성
x.to('cpu') # 텐서 x의 device를 cpu로
x.to('gpu') # 텐서 x의 device를 gpu로

5. 텐서 연산(Operations)

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(연산 뒤에 _ 를 붕여줌)

  • 그냥 a.add(b) 를 할 경우, a에는 b를 더한 값이 아닌 원래 a의 값이 들어가 있음
  • a.add_(b) 를 해주어야, a에 b를 더한 값이 새로 할당되어 a+b의 값이 들어가 있음

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로 채워라
profile
안녕하세요 반갑습니다. 공부한 내용들을 기록하고 있습니다.

0개의 댓글