DonHurry

step48. 닀쀑 클래슀 λΆ„λ₯˜ λ³Έλ¬Έ

DeZero/πŸ—»μ œ4κ³ μ§€

step48. 닀쀑 클래슀 λΆ„λ₯˜

_도녁 2023. 2. 28. 23:59

πŸ“’ λ³Έ ν¬μŠ€νŒ…μ€ λ°‘λ°”λ‹₯λΆ€ν„° μ‹œμž‘ν•˜λŠ” λ”₯λŸ¬λ‹3을 기반으둜 μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³ , 개인적인 곡뢀λ₯Ό μœ„ν•΄ μž‘μ„±ν•˜λŠ” ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ ꡐ재 ꡬ맀λ₯Ό κ°•λ ₯ μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€.

 

 

이전 λ‹¨κ³„μ—μ„œ κ΅¬ν˜„ν•œ μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜μ™€ μ—”νŠΈλ‘œν”Ό 였차λ₯Ό ν™œμš©ν•˜μ—¬ 닀쀑 클래슀 λΆ„λ₯˜λ₯Ό 해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. 이번 λ‹¨κ³„μ—μ„œλŠ” 슀파이럴 λ°μ΄ν„°μ…‹μ΄λΌλŠ” μ•„μ£Ό μž‘μ€ 데이터셋을 μ‚¬μš©ν•©λ‹ˆλ‹€. 데이터셋은 DeZero의 dezero/datasets.py에 μ€€λΉ„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

 

μš°μ„  슀파이럴 데이터셋을 읽어와 λͺ¨μ–‘을 ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 이번 λ¬Έμ œλŠ” 총 3 클래슀 λΆ„λ₯˜ 문제둜, μ •λ‹΅ 데이터(λ ˆμ΄λΈ”) t의 μ›μ†ŒλŠ” 0, 1, 2 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

import dezero

x, t = dezero.datasets.get_spiral(train=True)
print(x.shape)
print(t.shape)

(300, 2)

(300,)

 

 

이제 총 ν•™μŠ΅ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ£Όμ„μœΌλ‘œ 달아둔 λ²ˆν˜ΈλŒ€λ‘œ μ„€λͺ…을 μ΄μ–΄λ‚˜κ°€κ² μŠ΅λ‹ˆλ‹€.

import dezero
import math
import numpy as np
import matplotlib.pyplot as plt
from dezero import optimizers
import dezero.functions as F
from dezero.models import MLP


# 1: Hyperparameters
max_epoch = 300
batch_size = 30
hidden_size = 10
lr = 1.0

# 2: data, model, optimizer
x, t = dezero.datasets.get_spiral(train=True)
model = MLP((hidden_size, 3))
optimizer = optimizers.SGD(lr).setup(model)

data_size = len(x)
max_iter = math.ceil(data_size / batch_size)

for epoch in range(max_epoch):
    # 3: Shuffle index for data
    index = np.random.permutation(data_size)
    sum_loss = 0

    for i in range(max_iter):
    	# 4
        batch_index = index[i * batch_size:(i + 1) * batch_size]
        batch_x = x[batch_index]
        batch_t = t[batch_index]
		
        # 5
        y = model(batch_x)
        loss = F.softmax_cross_entropy(y, batch_t)
        model.cleargrads()
        loss.backward()
        optimizer.update()
        sum_loss += float(loss.data) * len(batch_t)

    # 6: Print loss every epoch
    avg_loss = sum_loss / data_size
    print('epoch %d, loss %.2f' % (epoch + 1, avg_loss))

 

1λ²ˆμ—μ„œ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. 은닉측 수, ν•™μŠ΅λ₯  λ“± μ‚¬λžŒμ΄ 직접 κ²°μ •ν•΄μ•Όν•˜λŠ” λ³€μˆ˜λ“€μž…λ‹ˆλ‹€. 2λ²ˆμ—μ„œλŠ” 데이터셋을 μ½μ–΄μ˜€κ³ , λͺ¨λΈκ³Ό μ˜΅ν‹°λ§ˆμ΄μ €λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. λ˜ν•œ μ€€λΉ„λœ 데이터셋을 λͺ¨λ‘ μ‚΄νŽ΄λ΄€μ„ λ•Œκ°€ 1 epoch μž…λ‹ˆλ‹€. 배치 μ‚¬μ΄μ¦ˆλŠ” 데이터λ₯Ό ν•œ λ²ˆμ— λͺ‡κ°œμ”© λ¬Άμ–΄μ„œ μ²˜λ¦¬ν•˜λƒλ₯Ό λœ»ν•©λ‹ˆλ‹€.

 

3λ²ˆμ—μ„œλŠ” λ°μ΄ν„°μ…‹μ˜ 인덱슀λ₯Ό λ¬΄μž‘μœ„λ‘œ μ„žμŠ΅λ‹ˆλ‹€. np.random.permutation ν•¨μˆ˜λŠ” 인수λ₯Ό N으둜 λ°›μœΌλ©΄, 0λΆ€ν„° N-1κΉŒμ§€μ˜ μ •μˆ˜κ°€ λ¬΄μž‘μœ„λ‘œ λ°°μ—΄λœ 리슀트λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

4λ²ˆμ—μ„œλŠ” λ―Έλ‹ˆλ°°μΉ˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. DeZero의 ν•¨μˆ˜λŠ” Variable ν˜Ήμ€ ndarray μΈμŠ€ν„΄μŠ€λ₯Ό μž…λ ₯으둜 λ°›λŠ”λ°, batch_x와 batch_tλŠ” ndarray μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€.

 

5λ²ˆμ—μ„œλŠ” μ—¬νƒœ ν•΄μ™”λ˜ κ²ƒμ²˜λŸΌ γ„±μšΈκΈ°λ₯Ό κ΅¬ν•˜κ³  λ§€κ°œλ³€μˆ˜λ₯Ό κ°±μ‹ ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ 6λ²ˆμ—μ„œ μ—ν­λ§ˆλ‹€ 손싀 ν•¨μˆ˜μ˜ κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

 

μ½”λ“œλ₯Ό 싀행해보면 손싀이 κ³„μ†ν•΄μ„œ μ€„μ–΄λ“œλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 손싀 κ·Έλž˜ν”„λ‘œ λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

 

ν•™μŠ΅μ΄ μ™„λ£Œλœ 신경망이 ν΄λž˜μŠ€λ³„ μ˜μ—­μ„ μ–΄λ–»κ²Œ κ΅¬λΆ„ν•˜κ³  μžˆλŠ”κ°€λ„ μ‹œκ°ν™”ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 이 ν΄λž˜μŠ€λ³„ μ˜μ—­μ„ κ²°μ • 경계(decision boundary)라고 ν•©λ‹ˆλ‹€. μ‹œκ°ν™”λŠ” μ•„λž˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ λ©λ‹ˆλ‹€.

# Plot boundary area the model predict
h = 0.001
x_min, x_max = x[:, 0].min() - .1, x[:, 0].max() + .1
y_min, y_max = x[:, 1].min() - .1, x[:, 1].max() + .1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
X = np.c_[xx.ravel(), yy.ravel()]

with dezero.no_grad():
    score = model(X)
predict_cls = np.argmax(score.data, axis=1)
Z = predict_cls.reshape(xx.shape)
plt.contourf(xx, yy, Z)

# Plot data points of the dataset
N, CLS_NUM = 100, 3
markers = ['o', 'x', '^']
colors = ['orange', 'blue', 'green']
for i in range(len(x)):
    c = t[i]
    plt.scatter(x[i][0], x[i][1], s=40, marker=markers[c], c=colors[c])
plt.show()

 

κ²°κ³Όλ₯Ό 보면 신경망이 μ†Œμš©λŒμ΄ νŒ¨ν„΄μ„ μ œλŒ€λ‘œ νŒŒμ•…ν•˜κ³  μžˆλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λΉ„μ„ ν˜• 뢄리 μ˜μ—­μ„ ν•™μŠ΅ν•œ 것이죠. 이처럼 측을 더 깊게 μŒ“λŠ” λ°©μ‹μœΌλ‘œ ν‘œν˜„λ ₯을 μ¦μ§„μ‹œν‚¬ 수 μžˆλ‹€λŠ” 것이 λ”₯λŸ¬λ‹μ˜ νŠΉμ§•μž…λ‹ˆλ‹€.