ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐ŸŒŸ ํ˜„๋Œ€ ์ธ๊ณต์ง€๋Šฅ ํ•™์Šต 2๋‹จ๊ณ„: ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง(CNN) ์‹ฌํ™”์™€ ์ „์ด ํ•™์Šต

๐Ÿ“… ํ•™์Šต ๊ธฐ๊ฐ„: 7~9๊ฐœ์›”

๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ: CNN ๊ตฌ์กฐ ์‹ฌํ™” ํ•™์Šต๊ณผ ์ „์ด ํ•™์Šต ํ™œ์šฉ


๐Ÿ“ 1. CNN์˜ ํ•„์š”์„ฑ๊ณผ ํ™œ์šฉ

ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง(Convolutional Neural Network, CNN)์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ๋ถ„์„์— ํŠนํ™”๋œ ์‹ ๊ฒฝ๋ง์ž…๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜, ๊ฐ์ฒด ํƒ์ง€, ์–ผ๊ตด ์ธ์‹ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” CNN์˜ ์‹ฌํ™” ๊ตฌ์กฐ์™€ ์ „์ด ํ•™์Šต์„ ์ค‘์‹ฌ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ 1-1. CNN ๊ตฌ์กฐ ์‹ฌํ™” ์ดํ•ด

CNN์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ํ•ฉ์„ฑ๊ณฑ ์ธต(Convolution Layer), ํ™œ์„ฑํ™” ํ•จ์ˆ˜, ํ’€๋ง ์ธต(Pooling Layer), **์™„์ „ ์—ฐ๊ฒฐ ์ธต(Fully Connected Layer)**๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์— **์ •๊ทœํ™” ์ธต(Batch Normalization)**๊ณผ **๋“œ๋กญ์•„์›ƒ ์ธต(Dropout Layer)**์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”‘ 1) ํ•ฉ์„ฑ๊ณฑ ์—ฐ์‚ฐ (Convolution Operation)

ํ•ฉ์„ฑ๊ณฑ์€ ํ•„ํ„ฐ(Filter) ๋˜๋Š” ์ปค๋„(Kernel)์„ ์ด์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€์˜ ํŠน์ง•์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

  • ํ•„ํ„ฐ: ๊ฐ€์ค‘์น˜ ํ–‰๋ ฌ๋กœ ๊ตฌ์„ฑ๋˜์–ด ํŠน์ง• ๋งต์„ ์ƒ์„ฑ
  • ์ŠคํŠธ๋ผ์ด๋“œ(Strides): ํ•„ํ„ฐ๊ฐ€ ์ด๋™ํ•˜๋Š” ๊ฐ„๊ฒฉ
  • ํŒจ๋”ฉ(Padding): ์ด๋ฏธ์ง€ ๊ฐ€์žฅ์ž๋ฆฌ ์ฒ˜๋ฆฌ (same, valid)

Python ์˜ˆ์ œ:

import torch
import torch.nn as nn

# ํ•ฉ์„ฑ๊ณฑ ์—ฐ์‚ฐ
conv = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3, stride=1, padding=1)
x = torch.randn(1, 1, 28, 28)  # ๋ฐฐ์น˜ ํฌ๊ธฐ, ์ฑ„๋„ ์ˆ˜, ๋†’์ด, ๋„ˆ๋น„
output = conv(x)
print(f"์ถœ๋ ฅ ํฌ๊ธฐ: {output.shape}")

๐Ÿ’ก ํ•ฉ์„ฑ๊ณฑ์˜ ์žฅ์ :

  • ๊ณต๊ฐ„ ๋ถˆ๋ณ€์„ฑ: ์ด๋ฏธ์ง€ ์œ„์น˜ ๋ณ€ํ™”์— ๊ฐ•๊ฑด
  • ํŒŒ๋ผ๋ฏธํ„ฐ ๊ณต์œ : ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ๊ฐ€์ค‘์น˜ ์‚ฌ์šฉ

๐Ÿ”‘ 2) ํ™œ์„ฑํ™” ํ•จ์ˆ˜์™€ ์ •๊ทœํ™”

๋ฐ˜์‘ํ˜•

CNN์—์„œ๋Š” ์ฃผ๋กœ ReLU (Rectified Linear Unit) ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, Batch Normalization์„ ํ†ตํ•ด ํ•™์Šต ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ๊ณผ์ ํ•ฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Python ์˜ˆ์ œ:

conv = nn.Conv2d(1, 3, 3, padding=1)
bn = nn.BatchNorm2d(3)
relu = nn.ReLU()

x = torch.randn(1, 1, 28, 28)
x = conv(x)
x = bn(x)
x = relu(x)
print(x.shape)

๐Ÿ”‘ 3) ํ’€๋ง ์ธต (Pooling Layer)

ํ’€๋ง์€ ํŠน์ง• ๋งต์˜ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ์—ฐ์‚ฐ๋Ÿ‰์„ ๊ฐ์†Œ์‹œํ‚ค๊ณ , ๊ณผ์ ํ•ฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ์ตœ๋Œ€ ํ’€๋ง(Max Pooling): ๊ฐ€์žฅ ํฐ ๊ฐ’ ์ถ”์ถœ
  • ํ‰๊ท  ํ’€๋ง(Average Pooling): ํ‰๊ท  ๊ฐ’ ์ถ”์ถœ

Python ์˜ˆ์ œ:

pool = nn.MaxPool2d(kernel_size=2, stride=2)
x = torch.randn(1, 3, 28, 28)
output = pool(x)
print(f"ํ’€๋ง ํ›„ ํฌ๊ธฐ: {output.shape}")

๐Ÿ”‘ 4) ๋“œ๋กญ์•„์›ƒ (Dropout)

๊ณผ์ ํ•ฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์‹ ๊ฒฝ๋ง ์ผ๋ถ€๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
Python ์˜ˆ์ œ:

dropout = nn.Dropout(p=0.5)
x = torch.randn(5, 10)
output = dropout(x)
print(output)

๐Ÿง  2. CNN ์•„ํ‚คํ…์ฒ˜ ์‚ฌ๋ก€

๐Ÿ“Œ 2-1. VGGNet (์‹ฌ์ธต ์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ)

  • ๊ตฌ์กฐ: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•ฉ์„ฑ๊ณฑ ์ธต๊ณผ ํ’€๋ง ์ธต์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์Œ“์€ ๊ตฌ์กฐ
  • ํŠน์ง•: ํ•„ํ„ฐ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๊นŠ์ด๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • ํ™œ์šฉ: ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜, ์ „์ด ํ•™์Šต

VGG ๊ตฌ์กฐ ์˜ˆ์ œ:

class VGGNet(nn.Module):
    def __init__(self):
        super(VGGNet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, 64, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.fc = nn.Sequential(
            nn.Linear(64 * 14 * 14, 256),
            nn.ReLU(),
            nn.Linear(256, 10)
        )
    
    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

model = VGGNet()
print(model)

๐Ÿ”„ 3. ์ „์ด ํ•™์Šต (Transfer Learning)

์ด๋ฏธ ํ•™์Šต๋œ ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ฃผ๋กœ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ์„ ์ž‘์€ ๋ฐ์ดํ„ฐ์…‹์— ๋ฏธ์„ธ ์กฐ์ •(Fine-Tuning)ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ ์‹ค์Šต: ์ „์ด ํ•™์Šต์„ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ (ResNet)

from torchvision import models, transforms
from PIL import Image

# ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
model = models.resnet18(pretrained=True)
model.eval()

# ์ด๋ฏธ์ง€ ์ „์ฒ˜๋ฆฌ
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor()
])

image = Image.open("sample.jpg")
x = preprocess(image).unsqueeze(0)

# ์˜ˆ์ธก
with torch.no_grad():
    output = model(x)
    print(f"์˜ˆ์ธก ๊ฒฐ๊ณผ: {output.argmax(1).item()}")

๐Ÿ’ก ์ „์ด ํ•™์Šต ์žฅ์ :

  • ์‹œ๊ฐ„ ์ ˆ์•ฝ: ์‚ฌ์ „ ํ•™์Šต๋œ ๊ฐ€์ค‘์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ ๋ชจ๋ธ ๊ตฌ์ถ•
  • ์„ฑ๋Šฅ ํ–ฅ์ƒ: ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ํ•™์Šต๋œ ํŠน์„ฑ ํ™œ์šฉ

๐Ÿ’ป ์‹ค์Šต ํ”„๋กœ์ ํŠธ: ์ „์ด ํ•™์Šต์„ ์ด์šฉํ•œ ๊ฝƒ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜

  1. ๋ชฉํ‘œ: ๊ฝƒ์˜ ์ข…๋ฅ˜๋ฅผ ์ด๋ฏธ์ง€๋กœ ์˜ˆ์ธก
  2. ๋ฐ์ดํ„ฐ์…‹: ๊ฝƒ ๋ฐ์ดํ„ฐ (5์ข…๋ฅ˜)
  3. ๋ชจ๋ธ: ์ „์ด ํ•™์Šต (ResNet)
  4. ํ‰๊ฐ€ ์ง€ํ‘œ: ์ •ํ™•๋„

์ฝ”๋“œ:

from torchvision import datasets
from torch.utils.data import DataLoader

# ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ
train_dataset = datasets.FakeData(transform=transforms.ToTensor())
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

# ์ „์ด ํ•™์Šต ๋ชจ๋ธ ์„ค์ •
model = models.resnet18(pretrained=True)
model.fc = nn.Linear(512, 5)  # ์ถœ๋ ฅ ์ฐจ์› ์กฐ์ •

# ํ•™์Šต ๋ฃจํ”„
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()

for epoch in range(5):
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
    print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")

๐Ÿ“ ํ•™์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ:

  • CNN์˜ ๊ตฌ์กฐ์™€ ๊ฐ ์ธต์˜ ์—ญํ• ์„ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • VGGNet๊ณผ ResNet ๊ฐ™์€ ์‹ฌ์ธต ์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•œ๋‹ค.
  • ์ „์ด ํ•™์Šต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • PyTorch๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์ „ ํ•™์Šต ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๋ฏธ์„ธ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

CNN, ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง, VGGNet, ResNet, ์ „์ด ํ•™์Šต, ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜, ๋”ฅ๋Ÿฌ๋‹, PyTorch, ํ•™์Šต ์ „์ด, ์‹ฌ์ธต ์‹ ๊ฒฝ๋ง, ๋ชจ๋ธ ์žฌ์‚ฌ์šฉ

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•