🐹 Pytorch

λ―Όλ‹¬νŒ½μ΄μš°μœ Β·2024λ…„ 7μ›” 21일

🐹 λ”₯λŸ¬λ‹ 기초

λͺ©λ‘ 보기
1/4

πŸ’‘ 1. νŒŒμ΄ν† μΉ˜(Pytorch)

  • ν…μ„œν”Œλ‘œμš°μ™€ ν•¨κ»˜ λ¨Έμ‹ λŸ¬λ‹, λ”₯λŸ¬λ‹μ—μ„œ κ°€μž₯ 널리 μ‚¬μš©λ˜λŠ” ν”„λ ˆμž„μ›Œν¬
  • μ΄ˆκΈ°μ—λŠ” TorchλΌλŠ” μ΄λ¦„μœΌλ‘œ Luaμ–Έμ–΄ 기반으둜 λ§Œλ“€μ–΄μ‘ŒμœΌλ‚˜, 파이썬 기반으둜 λ³€κ²½ν•œ 것이 νŒŒμ΄ν† μΉ˜
  • λ‰΄μš•λŒ€ν•™κ΅μ™€ 페이슀뢁(λ©”κ°€)이 κ³΅λ™μœΌλ‘œ κ°œλ°œν•˜μ˜€κ³ , ν˜„μž¬ κ°€μž₯ λŒ€μ€‘μ μ΄κ³  μ‚¬μš©μžκ°€ λ§Žμ€ λ¨Έμ‹ λŸ¬λ‹, λ”₯λŸ¬λ‹ ν”„λ ˆμž„μ›Œν¬

🐹 λͺ¨λ“ˆ μž„ν¬νŠΈ

import torch
print(torch.__version__) # 버전

1-1. 슀칼라(Scalar)

ν•˜λ‚˜μ˜ μƒμˆ˜λ₯Ό 의미

var1 = torch.tensor([10]) # 슀칼라
var1
> tensor([10])
type(var1)
torch.Tensor
var2 = torch.tensor([10.5]) # λ‹€μ–‘ν•œ μžλ£Œν˜• μ‚¬μš© κ°€λŠ₯
var2
> tensor([10.5000])
# 두 슀칼라의 사칙 μ—°μ‚°
print(var1 + var2)
print(var1 - var2)
print(var1 * var2)
print(var1 / var2)
> tensor([20.5000])
> tensor([-0.5000])
> tensor([105.])
> tensor([0.9524])

1-2. 벑터(Vector)

μƒμˆ˜κ°€ 두 개 이상 λ‚˜μ—΄λœ 경우

vec1 = torch.tensor([1, 2, 3])
vec1
> tensor([1, 2, 3])
vec2 = torch.tensor([1.4, 2.5, 3.3])
vec2
> tensor([1.4000, 2.5000, 3.3000])
# 두 λ²‘ν„°μ˜ 사칙 μ—°μ‚° (같은 ν¬μ§€μ…˜λΌλ¦¬ 계산됨)
print(vec1 + vec2)
print(vec1 - vec2)
print(vec1 * vec2)
print(vec1 / vec2)
> tensor([2.4000, 4.5000, 6.3000])
> tensor([-0.4000, -0.5000, -0.3000])
> tensor([1.4000, 5.0000, 9.9000])
> tensor([0.7143, 0.8000, 0.9091])
vec3 = torch.tensor([5, 10])
vec3
> tensor([ 5, 10])
vec1 + vec3
> RuntimeError: The size of tensor a (3) must match the size of tensor b (2) at non-singleton dimension 0

1-3. ν–‰λ ¬(Matrix)

2개 μ΄μƒμ˜ 벑터값을 κ°€μ§€κ³  λ§Œλ“€μ–΄μ§„ κ°’μœΌλ‘œ, ν•΄κ³Ό μ—΄μ˜ κ°œλ…μ„ κ°€μ§„ λ°μ΄ν„°λ“€μ˜ λ‚˜μ—΄

mat1 = torch.tensor([[1, 2], [3, 4]])
mat1
> tensor([[1, 2],
        [3, 4]])
mat2 = torch.tensor([[7, 8], [9, 10]])
mat2
> tensor([[ 7,  8],
        [ 9, 10]])
# 두 ν–‰λ ¬μ˜ 사칙연산
print(mat1 + mat2)
print(mat1 - mat2)
print(mat1 * mat2)
print(mat1 / mat2)
> tensor([[ 8, 10],
        [12, 14]])
> tensor([[-6, -6],
        [-6, -6]])
> tensor([[ 7, 16],
        [27, 40]])
> tensor([[0.1429, 0.2500],
        [0.3333, 0.4000]])

1-4. ν…μ„œ(Tensor)

  • λ‹€μˆ˜μ˜ 행렬이 λͺ¨μ΄λ©΄ ν…μ„œ
  • λ°°μ—΄μ΄λ‚˜ ν–‰λ ¬κ³Ό 맀우 μœ μ‚¬ν•œ 특수 자료ꡬ쑰
  • νŒŒμ΄ν† μΉ˜λŠ” ν…μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λΈμ˜ μž…λ ₯κ³Ό 좜λ ₯, λͺ¨λΈμ˜ λ§€κ°œλ³€μˆ˜λ“€μ„ 처리
tensor1 = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
tensor1
> tensor([[[1, 2],
         [3, 4]],

        [[5, 6],
         [7, 8]]])
tensor2 = torch.tensor([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])
tensor2
# 두 ν…μ„œμ˜ 사칙 μ—°μ‚°
print(tensor1 + tensor1)
print(tensor1 - tensor1)
print(tensor1 * tensor1)
print(tensor1 / tensor1)
> tensor([[[ 2,  4],
         [ 6,  8]],

        [[10, 12],
         [14, 16]]])
> tensor([[[0, 0],
         [0, 0]],

        [[0, 0],
         [0, 0]]])
> tensor([[[ 1,  4],
         [ 9, 16]],

        [[25, 36],
         [49, 64]]])
> tensor([[[1., 1.],
         [1., 1.]],

        [[1., 1.],
         [1., 1.]]])
# ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ 사칙 μ—°μ‚°
print(torch.add(tensor1, tensor2))
print(torch.subtract(tensor1, tensor2))
print(torch.multiply(tensor1, tensor2))
print(torch.divide(tensor1, tensor2))
print(torch.matmul(tensor1, tensor2)) # ν–‰λ ¬κ³±
> tensor([[[10, 12],
         [14, 16]],

        [[18, 20],
         [22, 24]]])
> tensor([[[-8, -8],
         [-8, -8]],

        [[-8, -8],
         [-8, -8]]])
> tensor([[[  9,  20],
         [ 33,  48]],

        [[ 65,  84],
         [105, 128]]])
> tensor([[[0.1111, 0.2000],
         [0.2727, 0.3333]],

        [[0.3846, 0.4286],
         [0.4667, 0.5000]]])
> tensor([[[ 31,  34],
         [ 71,  78]],

        [[155, 166],
         [211, 226]]])
print(tensor1.add_(tensor2)) # tensor1에 κ²°κ³Όλ₯Ό λ‹€μ‹œ μ €μž₯
print(tensor1.subtract_(tensor2))
> tensor([[[10, 12],
         [14, 16]],

        [[18, 20],
         [22, 24]]])
> tensor([[[1, 2],
         [3, 4]],

        [[5, 6],
         [7, 8]]])

πŸ’‘ 2. νŒŒμ΄ν† μΉ˜μ™€ ν…μ„œ

data = [[1, 2], [3, 4]]
data
> [[1, 2], [3, 4]]
data_tensor = torch.tensor(data)
data_tensor
> tensor([[1, 2],
        [3, 4]])
import numpy as np

ndarray = np.array(data_tensor)
ndarray
> array([[1, 2],
       [3, 4]])
data_tensor = torch.tensor(ndarray)
data_tensor
> tensor([[1, 2],
        [3, 4]])
a = torch.ones(2, 3) # μš”μ†Œκ°€ λͺ¨λ‘ 1인 2ν–‰ 3μ—΄μ§œλ¦¬ ν–‰λ ¬ λ§Œλ“¦
a
> tensor([[1., 1., 1.],
        [1., 1., 1.]])
b = torch.zeros(3, 4) # μš”μ†Œκ°€ λͺ¨λ‘ 0인 3ν–‰ 4μ—΄μ§œλ¦¬ ν–‰λ ¬ λ§Œλ“¦
b
> tensor([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])
c = torch.full((3, 4), 7) # μš”μ†Œκ°€ λͺ¨λ‘ 7인 3*4 ν–‰λ ¬
c
> tensor([[7, 7, 7, 7],
        [7, 7, 7, 7],
        [7, 7, 7, 7]])
d = torch.empty(2, 3) # 2*3 행렬에 μ˜λ―Έμ—†λŠ” κ°’
d
> tensor([[ 0.0000e+00,  0.0000e+00, -8.1644e+17],
        [ 3.1483e-41, -1.2856e+17,  3.1483e-41]])
e = torch.eye(5) # 5*5 λ‹¨μœ„ν–‰λ ¬
print(e)
> tensor([[1., 0., 0., 0., 0.],
        [0., 1., 0., 0., 0.],
        [0., 0., 1., 0., 0.],
        [0., 0., 0., 1., 0.],
        [0., 0., 0., 0., 1.]])
f = torch.arange(10) # 0λΆ€ν„° 9
f
> tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
g = torch.rand(2, 3) # 2*3 λžœλ€κ°’
g
> tensor([[0.2585, 0.7093, 0.5408],
        [0.2508, 0.8948, 0.3658]])
h = torch.randn(2, 3) # 평균이 0이고, ν‘œμ€€νŽΈμ°¨κ°€ 1인 μ •κ·œλΆ„ν¬μ—μ„œ λ¬΄μž‘μœ„ μƒ˜ν”Œλ§
h
> tensor([[ 0.4006, -0.1566,  1.3604],
        [ 0.1733,  0.8811, -1.5512]])
i = torch.arange(16).reshape(2, 2, 4) # 2ν–‰ 4μ—΄μ§œλ¦¬ 2개 (a, b, c -> bν–‰ cμ—΄μ§œλ¦¬ a개)
i, i.shape
> (tensor([[[ 0,  1,  2,  3],
          [ 4,  5,  6,  7]],
 
         [[ 8,  9, 10, 11],
          [12, 13, 14, 15]]]),
 torch.Size([2, 2, 4]))
# permute(): 차원을 μ§€μ •ν•œ 인덱슀둜 λ³€ν™˜
# i.shape = ([2, 2, 4])
j = i.permute((2, 1, 0)) # [2, 2, 4] -> [4, 2, 2]
j, j.shape
> (tensor([[[ 0,  8],
          [ 4, 12]],
 
         [[ 1,  9],
          [ 5, 13]],
 
         [[ 2, 10],
          [ 6, 14]],
 
         [[ 3, 11],
          [ 7, 15]]]),
 torch.Size([4, 2, 2]))
a = torch.arange(1, 13).reshape(3, 4)
a
> tensor([[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]])
a[1]
> tensor([5, 6, 7, 8])
a[0, -1]
> tensor(4)
 a[1:-1]
> tensor([[5, 6, 7, 8]])
a[:2, 2:]
> tensor([[3, 4],
        [7, 8]])

πŸ’‘ 3. μ½”λž©μ—μ„œ GPU μ‚¬μš©ν•˜κΈ°

μ½”λž©μ—μ„œ device λ³€κ²½ν•˜λŠ” 법:
상단 메뉴 -> λŸ°νƒ€μž„ -> λŸ°νƒ€μž„ μœ ν˜•λ³€κ²½ -> ν•˜λ“œμ›¨μ–΄ 가속기λ₯Ό GPUλ‘€ λ³€κ²½ -> μ €μž₯ -> μ„Έμ…˜ λ‹€μ‹œ μ‹œμž‘ 및 λͺ¨λ‘ μ‹€ν–‰

profile
μ–΄λ–»κ²Œ ν–„μŠ€ν„°κ°€ 개발자

0개의 λŒ“κΈ€