https://colab.research.google.com/drive/1uB-7ckV-Mrh0Zfugv9OIm7QuM_j2OLg5?usp=sharing
1๏ธโฃ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง
๐น ํฉ์ฑ๊ณฑ ์ธต์ ํ์์ฑ
๐ ์ฐ์ฐ๋ ๊ฐ์
• ์ด๋ฏธ์ง ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๊ณ์ฐํ๋ ๊ฒ์ด ์๋, ๊ตญ์์ ์ธ ๋ถ๋ถ์ ๊ณ์ฐํจ์ผ๋ก์จ ์๊ฐ๊ณผ ์์์ ์ ์ฝํ๊ณ ์ด๋ฏธ์ง์ ์ธ๋ฐํ ๋ถ๋ถ๊น์ง ๋ถ์ํ ์ ์๋ ์ ๊ฒฝ๋ง
๐ ์ด๋ฏธ์ง/์์ ์ฒ๋ฆฌ์ ์ ์ฉํ ๊ตฌ์กฐ
• 1์ฐจ์ ๋ฒกํฐ๋ก ํผ์ณ์ ๊ฐ์ค์น๋ก ๊ณ์ฐํ์ง ์๊ณ , ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๊ณต๊ฐ์ ๊ตฌ์กฐ (์. 3x3) ๋ฅผ ์ ์งํ๊ธฐ ์ํด ํฉ์ฑ๊ณฑ์ธต์ด ์กด์ฌํ๋ค.
• ๋ค์ฐจ์ ๋ฐฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ๊ตฌ์ฑ ๐ ์ปฌ๋ฌ ์ด๋ฏธ์ง ๊ฐ์ ๋ค์ฐจ์ ๋ฐฐ์ด ์ฒ๋ฆฌ์ ํนํ๋์ด ์์
๐น ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง ๊ตฌ์กฐ
1. ํฉ์ฑ๊ณฑ์ธต๊ณผ ํ๋ง์ธต์ ๊ฑฐ์น๋ฉฐ ์ ๋ ฅ ์ด๋ฏธ์ง์ ์ฃผ์ feature vector ๋ฅผ ์ถ์ถํ๋ค.
2. ์ถ์ถ๋ ์ฃผ์ ํน์ฑ ๋ฒกํฐ๋ค์ด ์์ ์ฐ๊ฒฐ์ธต์ ๊ฑฐ์น๋ฉฐ 1์ฐจ์ ๋ฒกํฐ๋ก ๋ณํ๋๋ค.
3. ์ถ๋ ฅ์ธต์์ ํ์ฑํ ํจ์์ธ ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์ฌ์ฉํด ์ต์ข ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
โ ์ ๋ ฅ์ธต
• ์ ๋ ฅ ์ด๋ฏธ์ง๊ฐ ์ต์ด๋ก ๊ฑฐ์น๊ฒ ๋๋ ๊ณ์ธต
• 3์ฐจ์ ๋ฐ์ดํฐ : ๋์ด, ๋๋น, ์ฑ๋
• ์ฑ๋์ ์ด๋ฏธ์ง๊ฐ gray scale ์ด๋ฉด 1 ๊ฐ์ ๊ฐ์ง๊ณ , ์ปฌ๋ฌ RGB ์ด๋ฉด 3 ๊ฐ์ ๊ฐ์ง๋ค.
→ (4, 4, 3) ํํ๋ก ํํํ ์ ์๋ค.
โก ํฉ์ฑ๊ณฑ์ธต
• ์ ๋ ฅ ๋ฐ์ดํฐ์์ ํน์ฑ์ ์ถ์ถํ๋ ์ญํ
• ํํฐ ( = ์ปค๋) ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง์ ํน์ฑ์ ์ถ์ถํ๊ฒ ๋๋๋ฐ, ์ถ์ถํ ๊ฒฐ๊ณผ๋ฌผ์ feature map ์ด๋ผ ๋ถ๋ฅธ๋ค.
• ์ปค๋์ด ์ด๋ฏธ์ง์ ๋ชจ๋ ์์ญ์ ํ์ผ๋ฉฐ ํน์ฑ์ ์ถ์ถํ๋๋ฐ, 3x3 , 5x5 ํฌ๊ธฐ๋ก ์ ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
• stride ๋ผ๋ ์ง์ ๋ ๊ฐ๊ฒฉ์ ๋ฐ๋ผ ์์ฐจ์ ์ผ๋ก ์ด๋ํ๋ค.
(์ด๋ ๊ณผ์ ์ ๊ต์ฌ ๊ทธ๋ฆผ ์ฐธ๊ณ ํ๊ธฐ)
• stride ๊ฐ๊ฒฉ๋งํผ ์ํํ๋ฉด์ ๋ชจ๋ ์ ๋ ฅ๊ฐ๊ณผ ํฉ์ฑ๊ณฑ ์ฐ์ฐ์ผ๋ก ์๋ก์ด ํน์ฑ ๋งต์ ๋ง๋ค๊ฒ ๋๋ฉฐ, ์๋ณธ ์ด๋ฏธ์ง์ ๋นํด ํฌ๊ธฐ๊ฐ ์ค์ด๋ ๋ค.
• ์ปฌ๋ฌ ์ด๋ฏธ์ง ํฉ์ฑ๊ณฑ
→ ํํฐ ์ฑ๋์ด 3
→ RGB ๊ฐ๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ฐ์ค์น๋ก ํฉ์ฑ๊ณฑ์ ์ ์ฉํ ํ ์ด๋ฅผ ๋ํด์ค๋ค๋ ์ โญโญ
→ ํํฐ ์ฑ๋์ด 3์ด๋ผ๊ณ ํํฐ ๊ฐ์๋ 3๊ฐ๋ผ๊ณ ์คํดํ๊ธฐ ์ฝ์ง๋ง, ํํฐ ๊ฐ์๋ ํ ๊ฐ๋ผ๋์ !! (์ด๋ฏธ์ง 1๊ฐ๊ฐ RGB ๋ก ํํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ฉด ๋จ)
• ํํฐ ๊ฐ์๊ฐ 2๊ฐ ์ด์์ธ ๊ฒฝ์ฐ
→ ํํฐ ๊ฐ๊ฐ์ ํน์ฑ ์ถ์ถ ๊ฒฐ๊ณผ์ ์ฑ๋์ด ๋๋ค. (4๊ฐ์ ํํฐ ๐ ํน์ฑ 2x2x4)
โข ํ๋ง์ธต
• ํฉ์ฑ๊ณฑ๊ณผ ์ ์ฌํ๊ฒ ํน์ฑ ๋งต์ ์ฐจ์์ ๋ค์ด ์ํ๋ง (์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ถ์ํ๋ ๊ฒ) ํ์ฌ ์ฐ์ฐ๋์ ๊ฐ์์ํค๊ณ ์ฃผ์ ํน์ฑ ๋ฒกํฐ๋ฅผ ์ถ์ถํ์ฌ ํ์ต์ ํจ๊ณผ์ ์ผ๋ก ํ ์ ์๊ฒ ํ๋ ๋ ์ด์ด
(1) Max pooling : ๋์ ์์ญ์์ ์ต๋๊ฐ์ ์ถ์ถ
(2) Average pooling : ๋์ ์์ญ์์ ํ๊ท ์ ๋ฐํ
→ ๋๋ถ๋ถ ํฉ์ฑ๊ณฑ ์ฐ์ฐ์์ ์ต๋ ํ๋ง์ด ์ฌ์ฉ
→ ํ๊ท ํ๋ง์ ๊ฐ ์ปค๋ ๊ฐ์ ํ๊ท ํ ์ํค์ด ์ค์ํ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ ํน์ฑ์ด ํฌ๋ฏธํด์ง ์ ์๊ธฐ ๋๋ฌธ
โฃ ์์ ์ฐ๊ฒฐ์ธต
• ํฉ์ฑ์ธต+ํ๋ง์ธต์ผ๋ก ์ฐจ์์ด ์ถ์๋ feature map ์ ์ต์ข ์ ์ผ๋ก fully-connected layer ๋ก ์ ๋ฌ๋์ด ์ด๋ฏธ์ง๋ฅผ 3์ฐจ์ ๋ฒกํฐ์์ 1์ฐจ์ ๋ฒกํฐ๋ก ํผ์น๋ค.
โค ์ถ๋ ฅ์ธต
• ์ํํธ๋งฅ์ค ํ์ฑํ ํจ์๊ฐ ์ฌ์ฉ๋์ด, ์ ๋ ฅ๊ฐ์ 0~1 ์ฌ์ด์ ๊ฐ์ผ๋ก ์ถ๋ ฅํ๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ์ง๊ฐ ๊ฐ ๋ ์ด๋ธ์ ์ํ ํ๋ฅ ๊ฐ์ ์ถ๋ ฅํ์ฌ, ๊ฐ์ฅ ๋์ ํ๋ฅ ๊ฐ์ ๊ฐ๋ ๋ ์ด๋ธ์ด ์ต์ข ๊ฐ์ผ๋ก ์ ์ ๋๋ค.
๐น 1D, 2D, 3D ํฉ์ฑ๊ณฑ
์ด๋ํ๋ ๋ฐฉํฅ์ ์์ ์ถ๋ ฅ ํํ์ ๋ฐ๋ผ 1D, 2D, 3D ๋ก ํฉ์ฑ๊ณฑ์ ๋ถ๋ฅํ ์ ์๋ค.
์ ๋ ฅ๋ฐ์ดํฐ์ ์ฐจ์์ด ์๋, ํํฐ์ ์งํ ๋ฐฉํฅ์ ์ฐจ์์ ์์ ๋ฐ๋ผ 1D, 2D, 3D ๋ฅผ ๊ตฌ๋ถํ๋ค!
โ 1D ํฉ์ฑ๊ณฑ
• ํํฐ๊ฐ ์๊ฐ์ ์ถ์ผ๋ก ์ข์ฐ๋ก๋ง ์ด๋ํ ์ ์๋ ํฉ์ฑ๊ณฑ
• ์ฃผ๋ก NLP ๋ถ์ผ์์ sequence data ์ ์ ์ฉํ์ฌ ์ฐ์ธ๋ค.
• ์ ๋ ฅ : [1,1,1,1,1] , ํํฐ : [0.25, 0.5, 0.25]
→ stride = 1 ์ด๋ผ๋ฉด ํํฐ๊ฐ ๊ฐ๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด์ ํฉ์ฑ๊ณฑ์ ํ์ฌ ์ถ๋ ฅ์ [1,1,1] ๋ก ๋์ถํ๋ค. ์ถ๋ ฅ ํํ๊ฐ 1D ์ ๋ฐฐ์ด์ด ๋๋ฉฐ ๊ทธ๋ํ ๊ณก์ ์ ์ํํ๊ณ ์ ํ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
• ์ ๋ ฅ : W , ํํฐ : kxk , ์ถ๋ ฅ : W
โก 2D ํฉ์ฑ๊ณฑ
• ๋ณดํต ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ์ ์ฉํ๋ ํฉ์ฑ๊ณฑ ํํ์ด๋ค.
• ํํฐ๊ฐ ๋์ด์ ๋๋น ๋ฐฉํฅ ๋ ๊ฐ๋ก ์์ง์ด๋ ํํ๋ฅผ ์๋ฏธํ๋ค.
• ์ ๋ ฅ : (W,H) , ํํฐ : (k,k) , ์ถ๋ ฅ (W,H)
โข 3D ํฉ์ฑ๊ณฑ
• ํํฐ๊ฐ ๋์ด, ๋๋น, ๊น์ด ๋ฐฉํฅ (x,y,z) ์ผ๋ก ์์ง์ผ ์ ์๋ ํํ๋ฅผ ์๋ฏธํ๋ค.
• ์ ๋ ฅ : (W,H,L) , ํํฐ : (k,k,d) , ์ถ๋ ฅ : (W,H,L) , d< L
• They are helpful in event detection in videos, 3D medical images : 3์ฐจ์ ๋ฉ๋์ปฌ ์ด๋ฏธ์ง, ๋น๋์ค์์ ์ด๋ฒคํธ ๊ฐ์ง์ ํจ๊ณผ์ ์ธ ํํ
โฃ 3D ์ ๋ ฅ์ ๊ฐ๋ 2D ํฉ์ฑ๊ณฑ
• ์ ๋ ฅ์ด 3D ํํ์์๋ ์ถ๋ ฅ ํํ๊ฐ 2D ํ๋ ฌ ํํ๋ฅผ ์ทจํ๋ ๊ฒฝ์ฐ
• ์ ๋ ฅ : (W,H,L) , ํํฐ : (k,k,L) , ์ถ๋ ฅ : (W,H)
• ๋ํ์ ์ธ ์ฌ๋ก : LeNet-5, VGG
โค 1x1 ํฉ์ฑ๊ณฑ
• 3D ํํ๋ก ์ ๋ ฅ๋ ์ด๋ฏธ์ง๋ฅผ, ํํฐ (1x1xL) ๋ฅผ ์ ์ฉํ์ฌ 2D ํํ๋ฅผ ์ถ๋ ฅํ๋ค.
• ์ ๋ ฅ : (W,H,L) , ํํฐ : (1,1,L) , ์ถ๋ ฅ : (W,H)
• 1x1 ํฉ์ฑ๊ณฑ์์ ์ฑ๋ ์๋ฅผ ์กฐ์ ํด ์ฐ์ฐ๋์ด ๊ฐ์๋๋ ํจ๊ณผ๊ฐ ์์ผ๋ฉฐ, ๋ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋คํธ์ํฌ ์ฌ๋ก๋ GoogLeNet ์ด ์๋ค.
2๏ธโฃ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง ๋ง๋ณด๊ธฐ
๐น ๋ฐ์ดํฐ ์ ํ
โ fashion_mnist ๋ฐ์ดํฐ์ : torchvision ์ ๋ด์ฅ๋ ์์ ๋ฐ์ดํฐ๋ก ์ด๋ํ, ์ ์ธ , ์๋ค ๊ฐ์ ์์ ์ด๋ฏธ์ง์ ๋ชจ์์ผ๋ก 10๊ฐ์ง ๋ถ๋ฅ ๊ธฐ์ค์ด ์๊ณ 28x28 ํฝ์ ์ ์ด๋ฏธ์ง 7๋ง๊ฐ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- train_images : 0~255 ์ฌ์ด์ ๊ฐ์ ๊ฐ๋ 28x28 ํฌ๊ธฐ์ ๋ํ์ด ๋ฐฐ์ด
- train_labels : 0์์ 9๊น์ง ์ ์๊ฐ์ ๊ฐ๋ ๋ฐฐ์ด
โ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถ
import numpy as np
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.nn.functional as F
import torchvision
import torchvision.transforms as transforms # ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from torch.utils.data import Dataset, DataLoader
# GPU ํน์ CPU ์ฅ์น ํ์ธ
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
• GPU ์ฌ์ฉ
(1) ํ๋์ GPU ๋ฅผ ์ฌ์ฉํ ๋ ์ฝ๋
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = Net()
model.to(device)
(2) ๋ค์์ GPU ๋ฅผ ์ฌ์ฉํ ๋ ์ฝ๋ : nn.DataParallel
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = Net()
if torch.cuda.device_count() > 1 :
model = nn.DataParallel(net)
model.to(device)
→ nn.DataParallel ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐฐ์นํฌ๊ธฐ๊ฐ ์์์ ๊ฐ GPU ๋ก ๋ถ๋ฐฐ๋๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. ๋ฐ๋ผ์ ๋ฐฐ์น ํฌ๊ธฐ๋ GPU ์๋งํผ ๋๋ ค์ฃผ์ด์ผ ํ๋ค.
โก ๋ฐ์ดํฐ์ ๋ด๋ ค๋ฐ๊ธฐ
train_dataset = torchvision.datasets.FashionMNIST('../sample', download = True,
transform = transforms.Compose([transforms.ToTensor()]))
test_dataset = torchvision.datasets.FashionMNIST('../sample', download = True, train=False,
transform = transforms.Compose([transforms.ToTensor()]))
• ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ : fashionMNIST ๋ด๋ ค๋ฐ์ ์์น๋ฅผ ์ง์
• download ๋ฅผ True ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ์์น์ ํด๋น ๋ฐ์ดํฐ์ ์ด ์๋์ง ํ์ธ ํ ๋ด๋ ค๋ฐ๋๋ค.
• transform : ์ด๋ฏธ์ง๋ฅผ ํ ์ (0~1) ๋ก ๋ณ๊ฒฝํ๋ค.
โข ๋ฐ์ดํฐ ๋ก๋์ ์ ๋ฌ
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size = 100)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size = 100)
• DataLoader ๋ฅผ ์ฌ์ฉํด ์ํ๋ ํฌ๊ธฐ์ ๋ฐฐ์น ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ฑฐ๋ ์์๊ฐ ๋ฌด์์ (shuffle)๋ก ์์ด๋๋ก ํ ์ ์๋ค.
• batch+size = 100 : ๋ฐ์ดํฐ๋ฅผ 100๊ฐ ๋จ์๋ก ๋ฌถ์ด์ ๋ถ๋ฌ์จ๋ค.
โฃ ๋ถ๋ฅ์ ์ฌ์ฉ๋ ํด๋์ค ์ ์
labels_map = {0 : 'T-Shirt', 1 : 'Trouser', 2 : 'Pullover', 3 : 'Dress', 4 : 'Coat', 5 : 'Sandal', 6 : 'Shirt',
7 : 'Sneaker', 8 : 'Bag', 9 : 'Ankle Boot'}
fig = plt.figure(figsize=(8,8)); # ์ถ๋ ฅํ ์ด๋ฏธ์ง์ ๊ฐ๋ก์ธ๋ก ๊ธธ์ด๋ก ๋จ์๋ inch
columns = 4;
rows = 5;
for i in range(1, columns*rows +1) :
img_xy = np.random.randint(len(train_dataset));
# 0 ~ (train_dataset ๊ธธ์ด) ๊ฐ์ ๊ฐ๋ ๋ถํฌ์์ ๋๋คํ ์ซ์ ํ ๊ฐ๋ฅผ ์์ฑํ๋ผ๋ ์๋ฏธ
img = train_dataset[img_xy][0][0,:,:]
# 3์ฐจ์ ๋ฐฐ์ด ์์ฑ
# ์ด๋ฏธ์ง ์ถ๋ ฅ
fig.add_subplot(rows, columns, i)
plt.title(labels_map[train_dataset[img_xy][1]])
plt.axis('off')
plt.imshow(img, cmap='gray')
plt.show()
๐ rand, randint, randn ๋น๊ต
| np.random.randint( )
- np.random.randint(10) : 0~10์ ์์์ ์ซ์๋ฅผ ์ถ๋ ฅ
- np.random.randint(1, 10) : 1~9 ์ฌ์ด์ ์์์ ์ซ์๋ฅผ ์ ๋ ฅ
| np.random.rand( )
- np.random.rand(8) : 0~1 ์ฌ์ด์ ์ ๊ทํ์ค๋ถํฌ ๋์๋ฅผ ํ๋ ฌ (1x8) ๋ก ์ถ๋ ฅ
- np.random.rand(4,2) : 0~1 ์ฌ์ด์ ์ ๊ทํ์ค๋ถํฌ ๋์๋ฅผ ํ๋ ฌ (4x2) ๋ก ์ถ๋ ฅ
| np.random.randn( )
- np.random.randn(8) : ํ๊ท ์ด 0์ด๊ณ ํ์คํธ์ฐจ๊ฐ 1์ธ ๊ฐ์ฐ์์ ์ ๊ท๋ถํฌ ๋์๋ฅผ ํ๋ ฌ (1x8) ๋ก ์ถ๋ ฅ
- np.random.randn(4,2) : ํ๊ท ์ด 0์ด๊ณ ํ์คํธ์ฐจ๊ฐ 1์ธ ๊ฐ์ฐ์์ ์ ๊ท๋ถํฌ ๋์๋ฅผ ํ๋ ฌ (4x2) ๋ก ์ถ๋ ฅ
๐น ๋ชจ๋ธ ์์ฑ
โ ์ฌ์ธต์ ๊ฒฝ๋ง ๋ชจ๋ธ ์์ฑ (ConvNet ์ด ์ ์ฉ๋์ง ์์ ๋คํธ์ํฌ)
class FashionMNIST(torch.nn.Module) :
# ํด๋์ค ํํ์ ๋ชจ๋ธ์ ํญ์ torch.nn.Module ์ ์์๋ฐ๋๋ค.
def __init__(self) : # ๊ฐ์ฒด๊ฐ ๊ฐ๋ ์์ฑ๊ฐ์ ์ด๊ธฐํ , ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ์๋์ผ๋ก ํธ์ถ๋จ
super(FashionMNIST,self).__init__() # FasionMNIST ๋ผ๋ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์๋ฐ๊ฒ ๋ค๋ ์๋ฏธ
self.fc1 = nn.Linear(in_features = 784, out_features = 256)
# ์ ํ ํ๊ท ๋ชจ๋ธ : nn.Linear()
# in_features : ์
๋ ฅ์ ํฌ๊ธฐ ๐ forward ๋ถ๋ถ์์ ์ด๋ถ๋ถ๋ง ๋๊ฒจ์ค
# out_features : ์ถ๋ ฅ์ ํฌ๊ธฐ ๐ forward ์ฐ์ฐ์ ๊ฒฐ๊ณผ์ ํด๋นํ๋ ๊ฐ
self.drop = nn.Dropout(0.25)
# 0,25 ๋งํผ์ ๋น์จ๋ก ํ
์์ ๊ฐ์ด 0์ด ๋๋ค.
# 0.75 ๋งํผ์ ๋น์จ์ ํ
์์ ๊ฐ์ (1/(1-p)) ๋งํผ ๊ณฑํด์ ธ์ ์ปค์ง๋ค.
self.fc2 = nn.Linear(in_features = 256, out_features = 128)
self.fc3 = nn.Linear(in_features = 128, out_features = 10)
def forward(self, input_data) : # ์์ ํ : ์
๋ ฅ x ๋ก๋ถํฐ ์์ธก๋ y ๋ฅผ ์ป๋ ๊ฒ
# ๋ฐ๋์ forward ๋ผ๋ ์ด๋ฆ์ ํจ์์ฌ์ผ ํ๋ค.
# ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ์ ํจ๊ป ํธ์ถํ๋ฉด ์๋์ผ๋ก ์คํ๋๋ค.
out = input_data.view(-1,784) # ํ์ดํ ์น view : reshape ๊ฐ์ ์ญํ
# 2์ฐจ์ ํ
์๋ก ๋ณ๊ฒฝํ๋, ์ฒซ๋ฒ์งธ ์ฐจ์์ ๊ธธ์ด๋ ์์์ ๊ณ์ฐํด์ฃผ๊ณ , ๋๋ฒ์งธ ์ฐจ์์ ๊ธธ์ด๋ 784๋ฅผ ๊ฐ๋๋ก ํด๋ฌ๋ผ๋ ์๋ฏธ
out = F.relu(self.fc1(out))
out = self.drop(out)
out = F.relu(self.fc2(out))
out = self.fc3(out)
return out
• ํด๋์ค ํํ์ ๋ชจ๋ธ์ ํญ์ torch.nn.Module ์ ์์๋ฐ๋๋ค.
• __init__() ์ ๊ฐ์ฒด๊ฐ ๊ฐ๋ ์์ฑ ๊ฐ์ ์ด๊ธฐํ ํ๋ ์ญํ ์ ํ๋ค. ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ์๋์ผ๋ก ํธ์ถ๋๋ค.
• nn : ๋ฅ๋ฌ๋ ๋ชจ๋ธ ๊ตฌ์ฑ์ ํ์ํ ๋ชจ๋์ด ๋ชจ์ฌ์๋ ํจํค์ง
• nn.dropout(p) : p๋งํผ์ ๋น์จ๋ก ํ ์์ ๊ฐ์ด 0์ด ๋๊ณ , ๋๋จธ์ง ๋น์จ ๊ฐ์ (1/(1-p)) ๋งํผ ๊ณฑํด์ ธ ์ปค์ง๋ค.
• forward( ) : ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ์ ํจ๊ป ํธ์ถํ๋ฉด ์๋์ผ๋ก ์คํ๋๋ฉฐ ์์ ํ ์ฐ์ฐ์ ์งํํ๋ค. ๋ฐ๋์ forward ๋ผ๋ ์ด๋ฆ์ ํจ์์ฌ์ผ ํ๋ค.
• data.view( ) : ํ์ดํ ์น์์ reshape ๊ฐ์ ์ญํ ๋ก ์ฐจ์์ ๋ฐ๊ฟ์ค๋ค.
๐ ํ์ฑํ ํจ์๋ฅผ ์ง์ ํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ
1. forward() ์์ ์ ์ → F.relu() = nn.functional.relu()
import torch.nn.functional as F
inputs = torch.randn(64,3,224,224)
weights = torch.randn(64,3,3,3)
bias = torch.randn(64)
outputs = F.conv2d(inputs, weight, bias, padding = 1)
โ ์ ๋ ฅ๊ณผ ๊ฐ์ค์น ์์ฒด๋ฅผ ์ง์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค. ๊ฐ์ค์น๋ฅผ ์ ๋ฌํด์ผ ํ ๋๋ง๋ค ๊ฐ์ค์น ๊ฐ์ ์๋ก ์ ์ํด์ผ ํจ
2. __init()__ ์์ ์ ์ → nn.ReLU()
import torch.nn as nn
inputs = torch.randn(64,3,224,224)
conv = nn.Conv2d(in_channels = 3, out_channels = 64, kernel_size = 3, padding = 1)
outputs = conv(inputs)
layer = nn.Conv2d(1,1,3)
โก ํ๋ผ๋ฏธํฐ ์ ์
• ๋ชจ๋ธ ํ์ต ์ ์ ์์คํจ์, ํ์ต๋ฅ , ์ตํฐ๋ง์ด์ ์ ๋ํด ์ ์
learning_rate = 0.001 # ํ์ต๋ฅ
model = FashionDNN()
model.to(device)
criterion = nn.CrossEntropyLoss() # ๋ถ๋ฅ๋ฌธ์ ์์คํจ์
optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate) # ์ตํฐ๋ง์ด์
print(model)
๐น ๋ชจ๋ธ ํ์ต
โ ์ฌ์ธต ์ ๊ฒฝ๋ง DNN ๋ชจ๋ธ ํ์ต
• ํ๋ผ๋ฏธํฐ ์ ์
learning_rate = 0.001 # ํ์ต๋ฅ
model = FashionMNIST()
model.to(device)
criterion = nn.CrossEntropyLoss() # ๋ถ๋ฅ๋ฌธ์ ์์คํจ์
optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate) # ์ตํฐ๋ง์ด์
print(model)
• ๋ชจ๋ธ ํ์ต
num_epochs = 5
count = 0
loss_list = [] # ์ค์ฐจ
iteration_list = [] # ๋ฐ๋ณตํ์
accuracy_list = [] # ์ ํ๋
predictions_list = [] # ์์ธก๊ฐ
labels_list = [] # ์ค์ ๊ฐ
for epoch in range(num_epochs) : # ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ 5๋ฒ ํ๋ จ
for images, labels in train_loader :
images, labels = images.to(device), labels.to(device) #๐ฉ
train = Variable(images.view(100,1,28,28)) #๐ฉ ์๋๋ฏธ๋ถ
labels = Variable(labels)
outputs = model(train)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
count += 1
if not (count%50) : # 50๋ฒ ๋ฐ๋ณต๋ง๋ค ์์ธก
total = 0
correct = 0
for images, labels in test_loader :
images, labels = images.to(device) , labels.to(device)
labels_list.append(labels)
test = Variable(images.view(100,1,28,28))
outputs = model(test)
predictions = torch.max(outputs, 1)[1].to(device)
predictions_list.append(predictions)
correct += (predictions == labels).sum()
total += len(labels)
accuracy = correct*100/total #๐ฉ
loss_list.append(loss.data)
iteration_list.append(count)
accuracy_list.append(accuracy)
if not (count % 500) : # 500 ๋ฐ๋ณต ๋ง๋ค
print('๋ฐ๋ณต ํ์ : {}, ์ค์ฐจ : {}, ์ ํ๋ : {}%'.format(count, loss.data, accuracy))
โช ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ๋ ๋์ผํ ์ฅ์น์ ์์ด์ผ ํ๋ค. model.to(device) ๊ฐ GPU ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, images.to(device), labels.to(device) ๋ GPU ์์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค.
โช torch.autograd ํจํค์ง์ Variable : ์ญ์ ํ๋ฅผ ์ํ ๋ฏธ๋ถ ๊ฐ์ ์๋์ผ๋ก ๊ณ์ฐํ๋ ํจ์๋ก, ๋๋ ๋ฏธ๋ถ์ ๊ณ์ฐํ๊ธฐ ์ํด์ ๊ผญ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
โช accuracy ๋ ์ ์ฒด ์์ธก์ ๋ํ ์ ํํ ์์ธก์ ๋น์จ๋ก ํํํ ์ ์๋ค.
โก ํฉ์ฑ๊ณฑ ๋คํธ์ํฌ ์์ฑ ๋ฐ ํ์ต
class FashionCNN(nn.Module) :
def __init__(self) :
super(FashionCNN, self).__init__()
self.layer1 = nn.Sequential( # ๐ฉ
nn.Conv2d(in_channels = 1, out_channels = 32, kernel_size =3, padding = 1), # ๐ฉ
nn.BatchNorm2d(32), # ๐ฉ
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2) # ๐ฉ
)
self.layer2 = nn.Sequential(
nn.Conv2d(in_channels = 32, out_channels = 64, kernel_size =3),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2)
)
self.fc1 = nn.Linear(in_features = 64*6*6, out_features = 600)
self.drop = nn.Dropout2d(0.25)
self.fc2 = nn.Linear(in_features = 600, out_features = 120)
self.fc3 = nn.Linear(in_features = 120, out_features = 10)
def forward(self, x) :
out = self.layer1(x)
out = self.layer2(out)
out = out.view(out.size(0), -1)
out = self.fc1(out)
out = self.drop(out)
out = self.fc2(out)
out = self.fc3(out)
return out
• nn.Sequential : __init__ ์์ ์ฌ์ฉํ ๋คํธ์ํฌ ๋ชจ๋ธ์ ์ ์ํ๊ณ , forward ํจ์์์ ๊ตฌํ๋ ์์ ํ๋ฅผ layer ํํ๋ก ๊ฐ๋ ์ฑ์ด ๋ฐ์ด๋ ์ฝ๋๋ก ์์ฑํ ์ ์๊ฒ ํด์ค๋ค. ๋ฐ์ดํฐ๊ฐ ๊ฐ ๊ณ์ธต์ ์์ฐจ์ ์ผ๋ก ์ง๋๊ฐ ๋ ์ฌ์ฉํ๋ฉด ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
• ํฉ์ฑ๊ณฑ์ธต : ํฉ์ฑ๊ณฑ ์ฐ์ฐ์ ํตํด ์ด๋ฏธ์ง ํน์ง์ ์ถ์ถ
nn.Conv2d( in_channels = 1, out_channels = 32, kernel_size = 3, padding = 1 )
๐ in_channels : ์ ๋ ฅ ์ฑ๋์ ์๋ก, ํ๋ฐฑ์ 1, ์ปฌ๋ฌ๋ 3์ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
โป ์ฑ๋์ 3์ฐจ์์ผ๋ก ์๊ฐํ๋ฉด '๊น์ด' ๋ฅผ ์๋ฏธํ๋ค๊ณ ๋ณผ ์ ์๋ค.
๐ out_channels : ์ถ๋ ฅ ์ฑ๋์ ์
๐ kernel_size : ์ปค๋์ ์ด๋ฏธ์ง ํน์ง์ ์ฐพ์๋ด๊ธฐ ์ํ ๊ณต์ฉ ํ๋ผ๋ฏธํฐ๋ก, CNN ์์์ ํ์ต ๋์์ด ๋ฐ๋ก ์ปค๋์ ํ๋ผ๋ฏธํฐ์ด๋ค. 3์ผ๋ก ์ง์ ํ๊ธฐ ๋๋ฌธ์ ์ปค๋์ ํฌ๊ธฐ๋ (3x3) ์ ์ฌ๊ฐํ ๋ชจ์์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค.
๐ padding : ์ถ๋ ฅ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด ์ ๋ ฅ ๋ฐ์ดํฐ ์ฃผ์์ 0์ ์ฑ์ฐ๋ ๊ณผ์ ์ ์๋ฏธํ๋ฉฐ, ํจ๋ฉ ๊ฐ์ด ํด์๋ก ์ถ๋ ฅ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ค.
• BatchNorm2d : ๊ฐ ๋ฐฐ์น ๋จ์๋ณ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ํ ๋ถํฌ๋ฅผ ๊ฐ์ง๋๋ผ๋ ํ๊ท ๊ณผ ๋ถ์ฐ์ ์ด์ฉํด ์ ๊ทํ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ํ๊ท ์ 0 ๋ถ์ฐ์ 1์ธ ๊ฐ์ฐ์์ ํํ๋ก ์กฐ์ ๋๋ค.
• MaxPool2d : ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ถ์์ํค๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ฉฐ, stride ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์ถ๋ ฅ ํฌ๊ธฐ๊ฐ ์์์ง๋ค.
nn.MaxPool2d(kernel_size=2, stride =2)
๐ kernel_size : mxn ํ๋ ฌ๋ก ๊ตฌ์ฑ๋ ๊ฐ์ค์น
๐ stride : ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ปค๋์ ์ ์ฉํ ๋ ์ด๋ํ ๊ฐ๊ฒฉ์ ์๋ฏธํ๋ฉฐ ์คํธ๋ผ์ด๋ ๊ฐ์ด ์ปค์ง๋ฉด ์ถ๋ ฅ ํฌ๊ธฐ๋ ์์์ง๋ค.
• nn.Linear : ํด๋์ค ๋ถ๋ฅ๋ฅผ ์ํด ์ด๋ฏธ์ง ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด ํํ๋ก ๋ณํํ์ฌ ์์ ํ๋ ๊ณผ์ ์ผ๋ก, Conv2d ์์ ์ฌ์ฉํ๋ ํจ๋ฉ, ์คํธ๋ผ์ด๋ ๊ฐ์ ๋ฐ๋ผ ์ถ๋ ฅ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ in_features ๊ฐ์ ๊ณ์ฐํด ์ ๋ ฅํด ์ฃผ์ด์ผ ํ๋ค. (๊ณต์์ ๊ต์ฌ๋ฅผ ์ฐธ๊ณ )
• ํ๋ผ๋ฏธํฐ ์ ์
learning_rate = 0.001
model = FashionCNN()
model.to(device)
criterion = nn.CrossEntropyLoss() # ์์คํจ์
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) # ์ตํฐ๋ง์ด์
print(model)
• ๋ชจ๋ธ ํ์ต ๊ฒฐ๊ณผ (์ฝ๋๋ DNN๊ณผ ๋์ผ)
3๏ธโฃ ์ ์ดํ์ต
๐ก ํฐ ๋ฐ์ดํฐ์ ์ ํ๋ณดํ๋๋ฐ ๋๋ ํ์ค์ ์ธ ์ด๋ ค์์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๋ฐฉ๋ฒ
ImageNet ์ฒ๋ผ ์์ฃผ ํฐ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ์ฌ ํ๋ จ๋ ๋ชจ๋ธ (Pre-trained model) ์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ ธ์ ํด๊ฒฐํ๋ ค๋ ๊ณผ์ ์ ๋ง๊ฒ ๋ณด์ ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
โญ ์ ์ดํ์ต ๋ฐฉ๋ฒ
(1) Feature extractor
(2) Fine-tuning
๐น ์ด๋ฏธ์ง ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
data_path = 'catanddog/train/'
transform = transforms.Compose(
[
transforms.Resize([256,256]),
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor()
]
)
train_dataset = torchvision.datasets.ImageFolder(
data_path, transform = transform
)
train_loader = torch.utils.data.DataLoader(
train_dataset,
batch_size = 32,
num_workers = 8,
shuffle = True
)
print(len(train_dataset)) # 385
• torchvision.transform : ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ณํํด ๋ชจ๋ฐ๋ฅด์ด ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํด์ค
โช Resize : ์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์
โช RandomResizedCrop : ์ด๋ฏธ์ง๋ฅผ ๋๋คํ ํฌ๊ธฐ ๋ฐ ๋น์จ๋ก ์๋ฆ (for data augmentation)
โช RandomHorizontalFlip : ์ด๋ฏธ์ง๋ฅผ ๋๋คํ๊ฒ ์ํ์ผ๋ก ๋ค์ง์
โช ToTensor : ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ํ ์๋ก ๋ณํ
๐น ํน์ฑ ์ถ์ถ ๋ฐฉ๋ฒ
๐ feature extractor
• ์ด๋ฏธ์ง ๋ท์ผ๋ก ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ๊ฐ์ ธ์จ ํ ๋ง์ง๋ง์ ์์ ์ฐ๊ฒฐ์ธต ๋ถ๋ถ๋ง ์๋ก ๋ง๋ ๋ค.
• ์ฌ์ ํ๋ จ๋ ๋คํธ์ํฌ์ ํฉ์ฑ๊ณฑ์ธต (๊ฐ์ค์น ๊ณ ์ ) ์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ํต๊ณผ ์ํค๊ณ ๊ทธ ์ถ๋ ฅ์ ๋ฐ์ดํฐ ๋ถ๋ฅ๊ธฐ(fully connected layer) ์์ ํ๋ จ์ํจ๋ค.
• ์ฌ์ฉ ๊ฐ๋ฅํ ๋ถ๋ฅ ๋ชจ๋ธ
Xception |
Inception V3 |
ResNet50 |
VGG16 |
VGG19 |
MobileNet |
๐ ์ฌ์ ํ๋ จ๋ ResNet18 ๋ชจ๋ธ ์ฌ์ฉ
• ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ ๋ด๋ ค๋ฐ๊ธฐ
resnet18 = models.resnet18(pretrained = True)
• ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ํ์ต ์ ๋ฌด ์ง์
param.requires_grad = False
๐ ์ญ์ ํ ์ค ํ๋ผ๋ฏธํฐ๋ค์ ๋ํ ๋ณํ๋ฅผ ๊ณ์ฐํ ํ์๊ฐ ์์์ ๋ํ๋
# ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ ํ์ต ์ ๋ฌด ์ง์
def set_parameter_requires_grad(model, feature_extracting = True) :
if feature_extracting :
for param in model.parameters() :
param.requires_grad = False # ๐ ์ญ์ ํ ์ค ํ๋ผ๋ฏธํฐ๋ค์ ๋ํ ๋ณํ๋ฅผ ๊ณ์ฐํ ํ์๊ฐ ์์
set_parameter_requires_grad(resnet18)
• ResNet18 ์ ์์ ์ฐ๊ฒฐ์ธต ์ถ๊ฐ
resnet18.fc = nn.Linear(512, 2) # 2๋ ํด๋์ค๊ฐ 2๊ฐ๋ผ๋ ์๋ฏธ
• ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ๊ฐ ํ์ธ
# ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ๊ฐ ํ์ธ
for name, param in resnet18.named_parameters() :
if param.requires_grad :
print(name, param.data)
• ๋ชจ๋ธ ๊ฐ์ฒด ์์ฑ ๋ฐ ์์คํจ์ ์ ์
# ๋ชจ๋ธ ๊ฐ์ฒด ๋ฐ ์์คํจ์
model = models.resnet18(pretrained = True)
for param in model.parameters() :
param.requires_grad = False
model.fc = torch.nn.Linear(512,2)
for param in model.fc.parameters() :
# ์์ ์ฐ๊ฒฐ์ธต์ ํ์ต
param.requires_grad = True
optimizer = torch.optim.Adam(model.fc.parameters())
cost = torch.nn.CrossEntropyLoss() # ์์คํจ์
print(model)
๐น ๋ฏธ์ธ์กฐ์ ๊ธฐ๋ฒ
๐ Fine-Tuning
• ํน์ฑ ์ถ์ถ ๊ธฐ๋ฒ์์ ๋์๊ฐ Pre-trained ๋ชจ๋ธ๊ณผ ํฉ์ฑ๊ณฑ์ธต, ๋ฐ์ดํฐ ๋ถ๋ฅ๊ธฐ์ ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธ ํ์ฌ ํ๋ จ ์ํค๋ ๋ฐฉ์ → ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ๋ชฉ์ ์ ๋ง๊ฒ ์ฌํ์ต ํ๊ฑฐ๋ ๊ฐ์ค์น ์ผ๋ถ๋ฅผ ์ฌํ์ต ํ๋ ๊ฒ
• ํน์ฑ ์ถ์ถ → ImageNet ๋ฐ์ดํฐ์ ์ด๋ฏธ์ง ํน์ง๊ณผ ๊ฐ๋ น, ์ ์์๊ฑฐ๋ ๋ฌผํ ์ด๋ฏธ์ง ํน์ง์ด ๋น์ทํ, ๊ทธ๋ฌ๋๊น ๋ชฉํ ํน์ฑ์ ์ ์ถ์ถํ๋ค๋ ๊ฐ์ ํ์ ์ข์ ์ฑ๋ฅ์ ๋ผ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ง์ฝ ํน์ฑ์ด ์๋ชป ์ถ์ถ๋์๋ค๋ฉด ๋ฏธ์ธ์กฐ์ ๊ธฐ๋ฒ์ผ๋ก ์๋ก์ด ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ๋คํธ์ํฌ ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ํน์ฑ์ ๋ค์ ์ถ์ถํ๋ค.
• ๋ง์ ์ฐ์ฐ๋์ด ํ์ํ๋ฏ๋ก ๊ผญ GPU ์ฌ์ฉํ๊ธฐ!
๋ฐ์ดํฐ์ ํฌ๊ธฐ | ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ๊ณผ์ ์ ์ฌ์ฑ | fine tuning ํ์ต ๋ฐฉ๋ฒ |
ํฌ๋ค | ์๋ค | ๋ชจ๋ธ ์ ์ฒด๋ฅผ ์ฌํ์ต |
ํฌ๋ค | ํฌ๋ค | ์์ ์ฐ๊ฒฐ์ธต๊ณผ ๊ฐ๊น์ด ํฉ์ฑ๊ณฑ์ธต์ ๋ท๋ถ๋ถ๊ณผ ๋ฐ์ดํฐ ๋ถ๋ฅ๊ธฐ๋ฅผ ํ์ต์ํจ๋ค. |
์๋ค | ์๋ค | ๋ฐ์ดํฐ๊ฐ ์ ์ด์ ์ผ๋ถ ๊ณ์ธต์ fine-tuning ์ ํ์ฌ๋ ํจ๊ณผ๊ฐ ์์ ์๋ ์๋ค. ํฉ์ฑ๊ณฑ์ธต์ ์ด๋ ๋ถ๋ถ๊น์ง ์๋ก ํ์ต์ํฌ์ง ์ ๋นํ ์ค์ ํด์ผ ํ๋ค. |
์๋ค | ํฌ๋ค | ๋ง์ ๊ณ์ธต์ ์ ์ฉํ๋ฉด ๊ณผ์ ํฉ์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ์์ ์ฐ๊ฒฐ์ธต์ ๋ํด์๋ง ์ ์ฉํ๋ค. |
4๏ธโฃ ์ค๋ช ๊ฐ๋ฅํ CNN
๐น Explainable CNN
• ๋ฅ๋ฌ๋ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋์ด ์ดํดํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ ์ํ๋ ๊ธฐ์
• ๋ธ๋๋ฐ์ค : ๋ฅ๋ฌ๋ ๋ชจ๋ธ๋ค์ ๋ด๋ถ์์ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ค๋ช ํ๊ธฐ ์ด๋ ต๋ค ๐ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ํ ์ดํด๋ฅผ ์ํด ์ด๋ฅผ ์๊ฐํ ํ ํ์์ฑ์ด ์๋ค
• ์๊ฐํ ๋ฐฉ๋ฒ : (1) ํํฐ์ ๋ํ ์๊ฐํ (2) ํน์ฑ ๋งต์ ๋ํ ์๊ฐํ
๐ featuremap ์๊ฐํ
• feature map : ํํฐ๋ฅผ ์ ๋ ฅ์ ์ ์ฉํ ๊ฒฐ๊ณผ
• feature map ์ ์๊ฐํ ํ๋ ๊ฒ์ ํน์ฑ ๋งต์์ ์ ๋ ฅ ํน์ฑ์ ๊ฐ์งํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ ์ ์๋๋ก ๋๋ ๊ฒ
class LayerActivations:
features=[]
def __init__(self, model, layer_num):
self.hook = model[layer_num].register_forward_hook(self.hook_fn)
#register_forward_hook : ์์ ํ์ค ๊ฐ ๋คํธ์ํฌ ๋ชจ๋์ ์
์ถ๋ ฅ์ ๊ฐ์ ธ์ด
# ๐ก hook ์ ์ฌ์ฉํ์ฌ ์ค๊ฐ ๊ฒฐ๊ณผ๊ฐ๋ค์ ํ์ธํ ์ ์๋ค - ํน์ฑ๋งต ์๊ฐํ
def hook_fn(self, module, input, output):
output = output
#self.features = output.to(device).detach().numpy()
self.features = output.detach().numpy()
def remove(self):
self.hook.remove()
โ hook
๐ ์ด๋ฐ ๊ณ์ธต์์๋ ์ ๋ ฅ ์ด๋ฏธ์ง์ ํํ๊ฐ ๋ง์ด ์ ์ง๋๋ค๊ฐ ์ค๋ฐ ๊ณ์ธต์์๋ ๊ณ ์์ด ์ด๋ฏธ์ง ํํ๊ฐ ์ ์ฐจ ์ฌ๋ผ์ง๊ณ , ์ถ๋ ฅ์ธต์ ๊ฐ๊น์ธ์๋ก ์๋ ํํ๋ ์ฌ๋ผ์ง๊ณ ์ด๋ฏธ์ง์ ํน์ง๋ค๋ง ์ ๋ฌ๋๋ ๊ฒ์ ํ์ธํด๋ณผ ์ ์๋ค.
๐ก CNN ์ ํํฐ์ ํน์ฑ ๋งต์ ์๊ฐํ ํ์ฌ CNN ๊ฒฐ๊ณผ์ ์ ๋ขฐ์ฑ์ ํ๋ณดํ ์ ์๋ค.
5๏ธโฃ ๊ทธ๋ํ ํฉ์ฑ๊ณฑ ๋คํธ์ํฌ
๐น Graph Convolutional Network
๐ ๊ทธ๋ํ
• ๋ ธ๋ : ์์
• ์ฃ์ง : ๊ฒฐํฉ ๋ฐฉ๋ฒ์ ์๋ฏธ
→ ํ๊ณ ์ ํ๋ ๋ฌธ์ ์ ๋ํ ์ ๋ฌธ๊ฐ ์ง์์ด๋ ์ง๊ด ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
๐ ๊ทธ๋ํ ์ ๊ฒฝ๋ง GNN
โ ๊ทธ๋ํ ๋ฐ์ดํฐ ํํ ๋ฐฉ๋ฒ
(1) ์ธ์ ํ๋ ฌ : ๊ด๋ จ์ฑ ์ฌ๋ถ์ ๋ฐ๋ผ 1,0 ์ผ๋ก ํํ
(2) ํน์ฑํ๋ ฌ : ์ธ์ ํ๋ ฌ๋ง์ผ๋ก ํน์ฑ์ ํ์ ํ๊ธฐ ์ด๋ ค์ ๋จ์ ํ๋ ฌ์ ์ ์ฉํ๋ค. ์ ๋ ฅ ๋ฐ์ดํฐ์์ ์ด์ฉํ ํน์ฑ์ ์ ํํ๋ค. ๊ฐ ํ์ ์ ํ๋ ํน์ฑ์ ๋ํด ๊ฐ ๋ ธ๋๊ฐ ๊ฐ์ง๋ ๊ฐ์ ์๋ฏธํ๋ค.
๐ ๊ทธ๋ํ ํฉ์ฑ๊ณฑ ๋คํธ์ํฌ GCN
• ์ด๋ฏธ์ง์ ๋ํ ํฉ์ฑ๊ณฑ์ ๊ทธ๋ํ ๋ฐ์ดํฐ๋ก ํ์ฅํ ์๊ณ ๋ฆฌ์ฆ
๐ ๊ทธ๋ํ ํฉ์ฑ๊ณฑ์ธต : ๊ทธ๋ํ ํํ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ ฌ ํํ๋ก ๋ณํํ๋ค.
๐ ๋ฆฌ๋์์ : ํน์ฑ ํ๋ ฌ์ ํ๋์ ๋ฒกํฐ๋ก ๋ณํํ๋ ํจ์ , ํน์ฑ ๋ฒกํฐ์ ๋ํด ํ๊ท ์ ๊ตฌํ๊ณ ๊ทธ๋ํ ์ ์ฒด๋ฅผ ํํํ๋ ํ๋์ ๋ฒกํฐ๋ฅผ ์์ฑํ๋ค.
• ํ์ฉ : SNS ๊ด๊ณ ๋คํธ์ํฌ, ํ์ ์ฐ๊ตฌ์ ์ธ์ฉ ๋คํธ์ํฌ, 3D Mesh
๋๊ธ