PyTorch ๐Ÿซจ

์„œ์€์„œยท2023๋…„ 8์›” 9์ผ
0

PyTorch

๋ชฉ๋ก ๋ณด๊ธฐ
1/5
post-thumbnail

PyTorch ๊ฐœ์š”

1๏ธโƒฃ ํŠน์ง• ๋ฐ ์žฅ์ 

ํŠน์ง•

GPU์—์„œ ํ…์„œ ์กฐ์ž‘ ๋ฐ ๋™์  ์‹ ๊ฒฝ๋ง ๊ตฌ์ถ•์ด ๊ฐ€๋Šฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ

โ–ถ๏ธŽ GPU : ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” ์—ญํ• 

  • ๋”ฅ๋Ÿฌ๋‹์—์„œ๋Š” ๊ธฐ์šธ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ๋ฏธ๋ถ„์„ ์“ด๋Š”๋ฐ, GPU๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น ๋ฅธ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • CUDA,cuDNN์ด๋ผ๋Š” API๋ฅผ ํ†ตํ•ด GPU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํŠนํžˆ ๋ณ‘๋ ฌ ๊ณ„์‚ฐ์‹œ CPU ์†๋„๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ„ ๐Ÿ‘‰๐Ÿป ๋”ฅ๋Ÿฌ๋‹์—์„œ GPU์‚ฌ์šฉ ํ•„์ˆ˜!

โ–ถ๏ธŽ ํ…์„œ(tensor)

  • ํŒŒ์ดํ† ์น˜์—์„œ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ
  • ๋‹จ์ผ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๋œ ์ž๋ฃŒ๋“ค์˜ ๋‹ค์ฐจ์› ํ–‰๋ ฌ ๐Ÿ‘‰๐Ÿป numpy์™€ ์œ ์‚ฌํ•˜๋‹ค
  • ๋ณ€์ˆ˜ ๋’ค์— .cuda()๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ GPU๋กœ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
import torch
torch.tensor([[1., -1.],[1., -1.]])
#----------------------------------#

# ์ถœ๋ ฅ๊ฐ’
tensor([[1., -1.],
		[1., -1.]])

โ–ถ๏ธŽ ๋™์  ์‹ ๊ฒฝ๋ง: ํ›ˆ๋ จ์„ ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค ๋„คํŠธ์›Œํฌ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ ์‹ ๊ฒฝ๋ง์„ ์˜๋ฏธ

  • ์—ฐ์‚ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์‹œ์— ๊ฐ’๋„ ์ดˆ๊ธฐํ™”๋˜๋Š” 'Define by Run' ๋ฐฉ์‹์„ ์‚ฌ์šฉ
  • ์—ฐ์‚ฐ ๊ทธ๋ž˜ํ”„์™€ ์—ฐ์‚ฐ์„ ๋ถ„๋ฆฌํ•ด์„œ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

์žฅ์ 

  • ๋‹จ์ˆœํ•˜์—ฌ ํšจ์œจ์ ์ธ ๊ณ„์‚ฐ ๊ฐ€๋Šฅ
  • ๋‚ฎ์€ CPU์˜ ํ™œ์šฉ์œผ๋กœ ํ•™์Šต ๋ฐ ์ถ”๋ก  ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ๋‹ค๋ฃจ๊ธฐ ์‰ฌ์›€
  • ์ง๊ด€์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์›€

2๏ธโƒฃ ํŒŒ์ดํ† ์น˜์˜ ๊ตฌ์กฐ

ํŒŒ์ดํ† ์น˜ API

์‚ฌ์šฉ์ž๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด API๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ…์„œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ์™€ ์‹ ๊ฒฝ๋ง์„ ๊ตฌ์ถ•ํ•˜๊ณ  ํ›ˆ๋ จํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.

  • torch
  • torch.autograd : ์ž๋™ ๋ฏธ๋ถ„ ํŒจํ‚ค์ง€
    • ๋‹ค๋ฅธ ๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ฐ€์žฅ ์ฐจ๋ณ„๋˜๋Š” ํŒจํ‚ค์ง€๋กœ ๋ฏธ๋ถ„ ๊ณ„์‚ฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • torch.nn : ์‹ ๊ฒฝ๋ง ๊ตฌ์ถ• ๋ฐ ํ›ˆ๋ จ ํŒจํ‚ค์ง€
  • torch.multiprocessing : ํŒŒ์ด์ฌ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ ํŒจํ‚ค์ง€
  • torch.utils : DataLoader ๋ฐ ๊ธฐํƒ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒจํ‚ค์ง€

ํŒŒ์ดํ† ์น˜ ์—”์ง„

Autograd C++, Aten C++, JIT C++, Python API๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.

์—ฐ์‚ฐ ์ฒ˜๋ฆฌ

๊ฐ€์žฅ ์•„๋ž˜ ๊ณ„์ธต์— ์†ํ•˜๋Š” C ๋˜๋Š” CUDA ํŒจํ‚ค์ง€๋Š” ์ƒ์œ„์˜ API์—์„œ ํ• ๋‹น๋œ ๊ฑฐ์˜ ๋ชจ๋“  ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • ์—ฌ๊ธฐ์—์„œ ์ œ๊ณต๋˜๋Š” ํŒจํ‚ค์ง€๋Š” CPU์™€ GPU๋ฅผ ์ด์šฉํ•˜์—ฌ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ, ๋‹ค์ฐจ์› ํ…์„œ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

PyTorch ๊ธฐ์ดˆ ๋ฌธ๋ฒ•

1๏ธโƒฃ tensor

ํ…์„œ ์ƒ์„ฑ ๋ฐ ๋ณ€ํ™˜

โ–ถ๏ธŽ ํ…์„œ ์ƒ์„ฑ

import torch
print(torch.tensor([[1,2],[3,4]])) # 2์ฐจ์› ํ˜•ํƒœ์˜ ํ…์„œ ์ƒ์„ฑ
print(torch.tensor([[1,2],[3,4]], device="cuda:0")) # GPU์— ํ…์„œ ์ƒ์„ฑ
print(torch.tensor([[1,2],[3,4]], dtype=torch.float64))

# ์ถœ๋ ฅ
tensor([[1, 2],
        [3, 4]])
------------------------
tensor([[1, 2],
        [3, 4]], device='cuda:0')
------------------------
tensor([[1., 2.],
        [3., 4.]], dtype=torch.float64)

โ–ถ๏ธŽ ํ…์„œ ndarray๋กœ ๋ณ€ํ™˜

temp = torch.tensor([[1,2],[3,4]])
print(temp.numpy())
temp = torch.tensor([[1,2],[3,4]], device="cuda:0") 
print(temp.to("cpu").numpy()) # GPU์ƒ์˜ ํ…์„œ๋ฅผ CPU์˜ ํ…์„œ๋กœ ๋ณ€ํ™˜ ํ›„ ndarray๋กœ ๋ณ€ํ™˜

# ์ถœ๋ ฅ
[[1 2]
 [3 4]]
------------------------
[[1 2]
 [3 4]]

ํ…์„œ ์ธ๋ฑ์Šค ์กฐ์ž‘

โ–ถ๏ธŽ ํ…์„œ์˜ ์ž๋ฃŒํ˜•

  • torch.FloatTensor
  • torch.DoubleTensor
  • torch.LongTensor

โ–ถ๏ธŽ ์ธ๋ฑ์‹ฑ

temp = torch.FloatTensor([1, 2, 3, 4, 5, 6, 7])
print(temp[0], temp[1], temp[-1]) # ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผ
print(temp[2:5], temp[4:-1]) # ์Šฌ๋ผ์ด์Šค๋กœ ์ ‘๊ทผ

# ์ถœ๋ ฅ
tensor(1.) tensor(2.) tensor(7.)
tensor([3., 4., 5.]) tensor([5., 6.])

ํ…์„œ ์—ฐ์‚ฐ ๋ฐ ์ฐจ์› ์กฐ์ž‘

โ–ถ๏ธŽ ์—ฐ์‚ฐ
๋„˜ํŒŒ์ด์˜ ndarray์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•œ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ…์„œ ๊ฐ„์˜ ํƒ€์ž…์ด ๊ฐ™์„ ๋•Œ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โ–ถ๏ธŽ ์ฐจ์›

  • ์ฐจ์› ๋ณ€๊ฒฝ : view
  • ์ฐจ์› ๊ฒฐํ•ฉ : stack, cat
  • ์ฐจ์› ๊ตํ™˜ : t,transpose
temp = torch.tensor([
    [1, 2], [3, 4]
])

print(temp.shape)
print('------------------------')
print(temp.view(4,1))
print('------------------------')
print(temp.view(-1)) # 1์ฐจ์› ๋ฒกํ„ฐ๋กœ ๋ณ€ํ˜•
print('------------------------')
print(temp.view(1, -1)) # (1,?)๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋กœ ๋‹ค๋ฅธ ์ฐจ์›์œผ๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฐ’์„ ์œ ์ถ”ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ 
print('------------------------')
print(temp.view(-1, 1)) # (?,1)๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋กœ ๋‹ค๋ฅธ ์ฐจ์›์œผ๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฐ’์„ ์œ ์ถ”ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ

# ์ถœ๋ ฅ
torch.Size([2, 2])
------------------------
tensor([[1],
        [2],
        [3],
        [4]])
------------------------
tensor([1, 2, 3, 4])
------------------------
tensor([[1, 2, 3, 4]])
------------------------
tensor([[1],
        [2],
        [3],
        [4]])

2๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ค€๋น„

๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ์ง€์ผ ๊ฒฝ์šฐ ๋ถ„์‚ฐ๋œ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ ํ›„ ์ „์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ๋ฐฐ์น˜ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ํ…์ŠคํŠธ์ธ ๊ฒฝ์šฐ ์ž„๋ฒ ๋”ฉ ๊ณผ์ •์„ ๊ฑฐ์ณ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธธ์ด์˜ ์‹œํ€€์Šค๋ฅผ ๋ฐฐ์น˜ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.
๐Ÿ‘‰๐Ÿป ์ž„๋ฒ ๋”ฉ์ด๋ž€ ์‚ฌ๋žŒ์ด ์“ฐ๋Š” ์ž์—ฐ์–ด๋ฅผ ๊ธฐ๊ณ„๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆซ์žํ˜•ํƒœ์ธ vector๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ • ํ˜น์€ ์ผ๋ จ์˜ ์ „์ฒด ๊ณผ์ •์„ ๋œปํ•œ๋‹ค.

ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

JSON, PDF, CSV ๋“ฑ์˜ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•
import pandas as pd
import torch

data = pd.read_csv('ํŒŒ์ผ ์ด๋ฆ„.csv')

x = torch.from_numpy(data['x'].values).unsqueeze(dim=1).float()
y = torch.from_numpy(data['y'].values).unsqueeze(dim=1).float()

๐Ÿ‘‰๐Ÿป squeeze ํ•จ์ˆ˜๋Š” ์ฐจ์›์ด 1์ธ ์ฐจ์›์„ ์ œ๊ฑฐํ•ด์ค€๋‹ค. ๋”ฐ๋กœ ์ฐจ์›์„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด 1์ธ ์ฐจ์›์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•œ๋‹ค. ๋งŒ์•ฝ ์ฐจ์›์„ ์„ค์ •ํ•œ๋‹ค๋ฉด ๊ทธ ์ฐจ์›๋งŒ ์ œ๊ฑฐํ•œ๋‹ค.
๐Ÿ‘‰๐Ÿป unsqueeze ํ•จ์ˆ˜๋Š” 1์ธ ์ฐจ์›์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋•Œ๋ฌธ์— ์–ด๋Š ์ฐจ์›์— 1์ธ ์ฐจ์›์„ ์ƒ์„ฑํ•  ์ง€ ๊ผญ ์ง€์ •ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
(๐Ÿ”— ์ถœ์ฒ˜ : https://sanghyu.tistory.com/86)

์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ์…‹์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ

๋”ฅ๋Ÿฌ๋‹์—์„œ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ฉ”๋ชจ๋ฆฌ์— ๋ถˆ๋Ÿฌ์™€ ํ›ˆ๋ จ์‹œํ‚ค๋ฉด ์‹œ๊ฐ„๊ณผ ๋น„์šฉ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค. ๋•Œ๋ฌธ์— `์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ์…‹`์„ ํ™œ์šฉํ•ด ์กฐ๊ธˆ์”ฉ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ  ๋ถˆ๋Ÿฌ ์‚ฌ์šฉํ•œ๋‹ค.

๊ธฐ๋ณธํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

class CustomDataset(torch.utils.data.Dataset):
	def __init__(self): # ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ๋ฐ์ดํ„ฐ์…‹์˜ ์ „์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
    def __len__(self): # ๋ฐ์ดํ„ฐ์…‹์˜ ๊ธธ์ด. ์ฆ‰, ์ด ์ƒ˜ํ”Œ์˜ ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜
    def __getitem__(self,index): # ๋ฐ์ดํ„ฐ์…‹์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜(index๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, ์ด๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์€ ํ…์„œ์˜ ํ˜•ํƒœ๋ฅผ ์ทจํ•ด์•ผ ํ•œ๋‹ค.)
    
tensor_dataset = CustomDataset('ํŒŒ์ผ๋ช…')
dataset = DataLoader(tensor_dataset,batch_size=4,shuffle=True)

โ–ถ๏ธŽ DataLoader

  • ๋ฐ์ดํ„ฐ์…‹์˜ ํŠน์ง•์„ ๊ฐ€์ ธ์˜ค๊ณ  ํ•˜๋‚˜์˜ ์ƒ˜ํ”Œ์— label์„ ์ง€์ •ํ•˜๋Š” ์ผ์„ ํ•œ ๋ฒˆ์— ํ•œ๋‹ค.

  • Dataset์„ batch๊ธฐ๋ฐ˜์˜ ๋”ฅ๋Ÿฌ๋‹๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•ด์„œ ๋ฏธ๋‹ˆ๋ฐฐ์น˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํ•™์Šตํ•  ๋•Œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

    • batch Dataset์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ batch size๋กœ slice๋˜์–ด ๊ณต๊ธ‰๋œ๋‹ค.(์—ฌ๋Ÿฌ ์˜ต์…˜ (๋ฐ์ดํ„ฐ ๋ฌถ๊ธฐ, ์„ฐ๊ธฐ, ์•Œ์•„์„œ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ)์„ ํ†ตํ•ด batch๋ฅผ ๋งŒ๋“ค์–ด ์คŒ) / ๊ฐ mini-batch์˜ ํฌ๊ธฐ ์ฆ‰ ํ•œ ๋ฒˆ์˜ ๋ฐฐ์น˜ ์•ˆ์— ์žˆ๋Š” ์ƒ˜ํ”Œ ์‚ฌ์ด์ฆˆ๋ฅผ ๋งํ•œ๋‹ค.
    • shuffle epoch๋งˆ๋‹ค ๋ฐ์ดํ„ฐ์…‹์„ ์„ž์–ด, ๋ฐ์ดํ„ฐ๊ฐ€ ํ•™์Šต๋˜๋Š” ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ํ•™์Šต ํ•  ๋•Œ๋Š” ํ•ญ์ƒ True๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
    • num_worker ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ์„ธ์„œ์˜ ์ˆ˜๋กœ num_worker ํ•˜๋‚˜๋ฅผ ๋” ์ถ”๊ฐ€ํ•˜๋ฉด 20% ์ •๋„ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.

ํŒŒ์ดํ† ์น˜์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ์…‹ ์‚ฌ์šฉ

ํ† ์น˜๋น„์ ผ์€ ํŒŒ์ดํ† ์น˜์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ์…‹๋“ค์ด ๋ชจ์—ฌ ์žˆ๋Š” ํŒจํ‚ค์ง€์ด๋‹ค. MNIST, ImageNet์„ ํฌํ•จํ•œ ์œ ๋ช…ํ•œ ๋ฐ์ดํ„ฐ์…‹๋“ค์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

3๏ธโƒฃ ๋ชจ๋ธ ์ •์˜

๋‹จ์ˆœ ์‹ ๊ฒฝ๋ง์„ ์ •์˜

model = nn.Linear(in_features = 1,out_features = 1, bias=True)

nn.Module()์„ ์ƒ์†ํ•˜์—ฌ ์ •์˜

ํŒŒ์ดํ†น์น˜์—์„œ nn.Module์„ ์ƒ์†๋ฐ›๋Š” ๋ชจ๋ธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ __init__()๊ณผ forward() ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•œ๋‹ค.

โ–ถ๏ธŽ init() : ๋ชจ๋ธ์—์„œ ์‚ฌ์šฉ๋  ๋ชจ๋“ˆ, ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ๋“ฑ์„ ์ •์˜
โ–ถ๏ธŽ forward() : ๋ชจ๋ธ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ •์˜

class MLP(Module):
def __init__(self,inputs):
	super(MLP,self).__init__()
    self.layer = Linear(inputs,1) # ๊ณ„์ธต ์ •์˜
    self.activation = Sigmoid() # ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์ •์˜
    
def forward(self,x):
	X = self.layer(x)
    X = self.activation(X)
    return X

Sequential ์‹ ๊ฒฝ๋ง์„ ์ •์˜

nn.Sequential์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข€ ๋” ๊ฐ€๋…์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ฒŒ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๊ทธ ์•ˆ์— ํฌํ•จ๋œ ๊ฐ ๋ชจ๋“ˆ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•ด ์ค€๋‹ค.
import torch.nn as nn

model = nn.Sequential(
          nn.Conv2d(1,20,5),
          nn.ReLU(),
          nn.Conv2d(20,64,5),
          nn.ReLU()
        )

nn.Sequential์€ ๋ชจ๋ธ์˜ ๊ณ„์ธต์ด ๋ณต์žกํ• ์ˆ˜๋ก ํšจ๊ณผ๊ฐ€ ๋” ๋›ฐ์–ด๋‚˜๋‹ค!

(๐Ÿ”— ์ถœ์ฒ˜ : https://pytorch.org/docs/stable/generated/torch.nn.Sequential.html )

4๏ธโƒฃ ๋ชจ๋ธ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •์˜

์†์‹คํ•จ์ˆ˜

ํ•™์Šตํ•˜๋Š” ๋™์•ˆ ์ถœ๋ ฅ๊ณผ ์‹ค์ œ ๊ฐ’ ์‚ฌ์ด์˜ ์˜ค์ฐจ๋ฅผ ์ธก์ •

  • BCELoss : ์ด์ง„ ๋ถ„๋ฅ˜๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ
  • CrossEntropyLoss : ๋‹ค์ค‘ ํด๋ž˜์Šค ๋ถ„๋ฅ˜๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ
  • MSELoss : ํšŒ๊ท€ ๋ชจ๋ธ์—์„œ ์‚ฌ์šฉ

์˜ตํ‹ฐ๋งˆ์ด์ €

๋ฐ์ดํ„ฐ์™€ ์†์‹ค ํ•จ์ˆ˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ชจ๋ธ์˜ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •

โ–ถ๏ธŽ ์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ์ฃผ์š” ํŠน์„ฑ

  • step() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  • zero_grad() ๋ฉ”์„œ๋“œ๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €์— ์‚ฌ์šฉ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์˜ ๊ธฐ์šธ๊ธฐ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
  • torch.optim.lr_scheduler : ์—ํฌํฌ์— ๋”ฐ๋ผ ํ•™์Šต๋ฅ (learning rate)์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•™์Šต๋ฅ  ์Šค์ผ€์ค„๋Ÿฌ

๋ฏธ๋ฆฌ ์ง€์ •ํ•œ ํšŸ์ˆ˜์˜ ์—ํฌํฌ๋ฅผ ์ง€๋‚  ๋•Œ๋งˆ๋‹ค ํ•™์Šต๋ฅ ์„ ๊ฐ์†Œ์‹œํ‚จ๋‹ค. ํ•™์Šต๋ฅ  ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•™์Šต ์ดˆ๊ธฐ์—๋Š” ๋น ๋ฅธ ํ•™์Šต์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ `์ „์—ญ ์ตœ์†Œ์ ` ๊ทผ์ฒ˜์— ๋‹ค๋‹ค๋ฅด๋ฉด ํ•™์Šต๋ฅ ์„ ์ค„์—ฌ์„œ ์ตœ์ ์ ์„ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

์ง€ํ‘œ

ํ›ˆ๋ จ๊ณผ ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค.

5๏ธโƒฃ ๋ชจ๋ธ ํ›ˆ๋ จ

์•ž์„œ ๋งŒ๋“  ๋ชจ๋ธ์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šต์‹œํ‚จ๋‹ค. ์˜ค์ฐจ๊ฐ€ ์ค„์–ด๋“ค์–ด ์ „์—ญ ์ตœ์†Œ์ ์— ์ด๋ฅผ๋•Œ๊นŒ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ณ„์† ์ˆ˜์ •ํ•œ๋‹ค.

โ–ถ๏ธŽ ์ ˆ์ฐจ

  • optimizer.zero_grad() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ธฐ์šธ๊ธฐ๋ฅผ ์ดˆ๊ธฐํ™”!(์ค‘์š”!)
    ๐Ÿ‘‰๐Ÿป ํŒŒ์ดํ† ์น˜๋Š” ๊ธฐ์šธ๊ธฐ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด loss.backward() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ธฐ์šธ๊ธฐ ๊ฐ’์ด ์ด์ „ ๊ธฐ์šธ ๊ฐ’์— ๋ˆ„์ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.(๋‹จ, RNN์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ํšจ๊ณผ์ !)
  • loss.backward() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ธฐ์šธ๊ธฐ๋ฅผ ์ž๋™ ๊ณ„์‚ฐ
for epoch in range(100):
	yhat = model(X_train)
    loss = criterion(yhat,y_train)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

6๏ธโƒฃ ๋ชจ๋ธ ํ‰๊ฐ€

์ฃผ์–ด์ง„ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•œ๋‹ค.

model.eval()
๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•  ๋•Œ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฐ€๋กœ ๊ฒ€์ฆ๊ณผ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹์— ์‚ฌ์šฉํ•œ๋‹ค.
๐Ÿšจ model.eval()์—์„œ๋Š” no_grad()๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค! ๊ฒ€์ฆ๊ณผ์ •์—์„œ๋Š” ์—ญ์ „ํŒŒ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

profile
๋‚ด์ผ์˜ ๋‚˜๋Š” ์˜ค๋Š˜๋ณด๋‹ค ๋” ๋‚˜์•„์ง€๊ธฐ๋ฅผ :D

0๊ฐœ์˜ ๋Œ“๊ธ€