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

๋ฐ˜์‘ํ˜•

๐ŸŒŸ ํ˜„๋Œ€ ์ธ๊ณต์ง€๋Šฅ ํ•™์Šต 2๋‹จ๊ณ„: ์ธ๊ณต์‹ ๊ฒฝ๋ง๊ณผ ๋”ฅ๋Ÿฌ๋‹

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

๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ: ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ์˜ ์ดํ•ด์™€ ๋”ฅ๋Ÿฌ๋‹ ๊ธฐ๋ฒ• ํ•™์Šต


๐Ÿ“ 1. ์ธ๊ณต์‹ ๊ฒฝ๋ง(ANN) ๊ธฐ์ดˆ

์ธ๊ณต์‹ ๊ฒฝ๋ง(Artificial Neural Network)์€ ์ธ๊ฐ„์˜ ๋‡Œ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฐฉํ•˜์—ฌ ๋งŒ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
๋‰ด๋Ÿฐ(Neuron)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ ์ธต(Layer)์„ ๊ฑฐ์ณ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.
๋”ฅ๋Ÿฌ๋‹์€ ์ด๋Ÿฌํ•œ ์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ๋ฅผ ์‹ฌํ™”ํ•˜์—ฌ ๋‹ค์ธต ์‹ ๊ฒฝ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ 1-1. ์‹ ๊ฒฝ๋ง์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ

์‹ ๊ฒฝ๋ง์€ ์ž…๋ ฅ์ธต(Input Layer), ์€๋‹‰์ธต(Hidden Layer), **์ถœ๋ ฅ์ธต(Output Layer)**์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ์ธต: ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ์ธต
  • ์€๋‹‰์ธต: ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ํŠน์ง•์„ ์ถ”์ถœํ•˜๋Š” ์ธต
  • ์ถœ๋ ฅ์ธต: ์ตœ์ข… ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ธต

๐Ÿ”‘ 1) ํผ์…‰ํŠธ๋ก (Perceptron)

ํผ์…‰ํŠธ๋ก ์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‹ ๊ฒฝ๋ง ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ๊ฐ’ xx์™€ ๊ฐ€์ค‘์น˜ ww๋ฅผ ๊ณฑํ•˜์—ฌ ํ•ฉ์‚ฐ ํ›„, ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

y=f(∑wixi+b)y = f(\sum w_i x_i + b)

์—ฌ๊ธฐ์„œ bb๋Š” ๋ฐ”์ด์–ด์Šค๋กœ, ๋ชจ๋ธ์˜ ์ถœ๋ ฅ์„ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ’ป ์ฝ”๋“œ ์‹ค์Šต: ๋‹จ์ผ ํผ์…‰ํŠธ๋ก  ๊ตฌํ˜„

import numpy as np

# ํ™œ์„ฑํ™” ํ•จ์ˆ˜ (๊ณ„๋‹จ ํ•จ์ˆ˜)
def step_function(x):
    return np.where(x > 0, 1, 0)

# ์ž…๋ ฅ๊ฐ’๊ณผ ๊ฐ€์ค‘์น˜
x = np.array([1, 2])
w = np.array([0.5, -0.2])
b = -0.1

# ํผ์…‰ํŠธ๋ก  ์—ฐ์‚ฐ
output = step_function(np.dot(x, w) + b)
print(f"ํผ์…‰ํŠธ๋ก  ์ถœ๋ ฅ: {output}")

๐Ÿ”‘ 2) ํ™œ์„ฑํ™” ํ•จ์ˆ˜ (Activation Function)

ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ ์‹ ํ˜ธ๋ฅผ ๋น„์„ ํ˜• ๋ณ€ํ™˜ํ•˜์—ฌ ๋‹ค์Œ ์ธต์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ด๋ฆ„ ์ˆ˜์‹ ํŠน์ง•

ReLU f(x)=maxโก(0,x)f(x) = \max(0, x) ์Œ์ˆ˜๋ฅผ 0์œผ๋กœ ๋ณ€ํ™˜
Sigmoid f(x)=11+e−xf(x) = \frac{1}{1 + e^{-x}} 0๊ณผ 1 ์‚ฌ์ด๋กœ ์••์ถ•
Tanh f(x)=ex−e−xex+e−xf(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} -1๊ณผ 1 ์‚ฌ์ด๋กœ ์••์ถ•
Softmax exi∑exj\frac{e^{x_i}}{\sum e^{x_j}} ํ™•๋ฅ ๋กœ ๋ณ€ํ™˜ (๋ถ„๋ฅ˜)

๐Ÿ’ป ์ฝ”๋“œ ์‹ค์Šต: ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ๊ตฌํ˜„

def relu(x):
    return np.maximum(0, x)

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def softmax(x):
    exp_x = np.exp(x - np.max(x))
    return exp_x / np.sum(exp_x)

# ์˜ˆ์ œ
x = np.array([1.0, -1.0, 0.5])
print(f"ReLU: {relu(x)}")
print(f"Sigmoid: {sigmoid(x)}")
print(f"Softmax: {softmax(x)}")

๐Ÿง  2. ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ ํ•™์Šต: PyTorch ์‚ฌ์šฉํ•˜๊ธฐ

๋ฐ˜์‘ํ˜•

๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ PyTorch๋Š” ์ง๊ด€์ ์ด๊ณ  ์œ ์—ฐํ•˜์—ฌ ์—ฐ๊ตฌ์™€ ๊ฐœ๋ฐœ์— ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ 2-1. PyTorch ๊ธฐ๋ณธ ๊ตฌ์กฐ

  1. ๋ฐ์ดํ„ฐ ์ค€๋น„: ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋”ฉ ๋ฐ ์ „์ฒ˜๋ฆฌ
  2. ๋ชจ๋ธ ์ •์˜: ์‹ ๊ฒฝ๋ง ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์ถ•
  3. ์†์‹ค ํ•จ์ˆ˜: ์˜ค์ฐจ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜
  4. ์˜ตํ‹ฐ๋งˆ์ด์ €: ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ
  5. ํ›ˆ๋ จ ๋ฐ ํ‰๊ฐ€: ํ•™์Šต ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๊ณ  ํ…Œ์ŠคํŠธ

๐Ÿ’ป ์ฝ”๋“œ ์‹ค์Šต: ๊ธฐ๋ณธ ์‹ ๊ฒฝ๋ง ๊ตฌํ˜„

import torch
import torch.nn as nn
import torch.optim as optim

# ๋ฐ์ดํ„ฐ ์ค€๋น„
X = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y = torch.tensor([[2.0], [4.0], [6.0], [8.0]])

# ๋ชจ๋ธ ์ •์˜
model = nn.Sequential(
    nn.Linear(1, 1)  # ์ž…๋ ฅ 1๊ฐœ, ์ถœ๋ ฅ 1๊ฐœ
)

# ์†์‹ค ํ•จ์ˆ˜์™€ ์˜ตํ‹ฐ๋งˆ์ด์ €
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# ํ•™์Šต
for epoch in range(100):
    model.train()
    optimizer.zero_grad()
    outputs = model(X)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()

    if (epoch+1) % 20 == 0:
        print(f"Epoch [{epoch+1}/100], Loss: {loss.item():.4f}")

# ์˜ˆ์ธก
with torch.no_grad():
    pred = model(torch.tensor([[5.0]]))
    print(f"์˜ˆ์ธก๊ฐ’: {pred.item()}")

๐ŸŒ‰ 3. ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง(CNN)

CNN์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํŠนํ™”๋œ ์‹ ๊ฒฝ๋ง์ž…๋‹ˆ๋‹ค.

  • ํ•ฉ์„ฑ๊ณฑ ๋ ˆ์ด์–ด(Convolution Layer): ํŠน์ง• ๋งต ์ถ”์ถœ
  • ํ’€๋ง ๋ ˆ์ด์–ด(Pooling Layer): ํŠน์ง• ๋งต ํฌ๊ธฐ ์ถ•์†Œ
  • ์™„์ „ ์—ฐ๊ฒฐ ๋ ˆ์ด์–ด(Fully Connected Layer): ๋ถ„๋ฅ˜ ๊ฒฐ๊ณผ ๋„์ถœ

๐Ÿ’ป ์ฝ”๋“œ ์‹ค์Šต: CNN ๊ตฌํ˜„

import torch.nn.functional as F

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3)
        self.fc1 = nn.Linear(32*26*26, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = x.view(-1, 32*26*26)
        x = self.fc1(x)
        return F.log_softmax(x, dim=1)

model = SimpleCNN()
print(model)

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

  • ์ธ๊ณต์‹ ๊ฒฝ๋ง์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ™œ์„ฑํ™” ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜์™€ ํŠน์„ฑ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • PyTorch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์‹ ๊ฒฝ๋ง์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • CNN์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ํ™œ์šฉ ์‚ฌ๋ก€๋ฅผ ์ดํ•ดํ•œ๋‹ค.

๐Ÿ’ก ์‹ค์Šต ํ”„๋กœ์ ํŠธ: ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ (MNIST ๋ฐ์ดํ„ฐ์…‹)

  1. ๋ชฉํ‘œ: ์†๊ธ€์”จ ์ˆซ์ž ์ธ์‹
  2. ๋ฐ์ดํ„ฐ์…‹: MNIST (0~9 ์ˆซ์ž ์ด๋ฏธ์ง€)
  3. ๋ชจ๋ธ: CNN

์ฝ”๋“œ:

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

# ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ
transform = transforms.Compose([transforms.ToTensor()])
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)

# ํ•™์Šต ๋ฃจํ”„
for epoch in range(5):
    for images, labels in train_loader:
        output = model(images)
        loss = criterion(output, labels)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    print(f"Epoch [{epoch+1}/5], Loss: {loss.item():.4f}")

์ธ๊ณต์‹ ๊ฒฝ๋ง, ๋”ฅ๋Ÿฌ๋‹, PyTorch, CNN, ํ™œ์„ฑํ™” ํ•จ์ˆ˜, ๋จธ์‹ ๋Ÿฌ๋‹, ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜, ์‹ ๊ฒฝ๋ง ๊ตฌํ˜„, ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•, ์†์‹ค ํ•จ์ˆ˜, ์˜ตํ‹ฐ๋งˆ์ด์ €

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
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
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•