티스토리 뷰
공부 : 밑바닥부터 시작하는 딥러닝 1 chapter 3,4
신경망 학습 절차
1. 미니 배치
훈련 데이터 중 일부를 랜덤하게 가져온다. 이 데이터를 미니 배치라 한다. 미니 배치의 손실 함수값을 줄이는 것이 목표
2. 기울기 산출
미니 배치의 손실 함수값을 줄이기 위해 가중치 매개변수의 기울기를 구한다. 기울기는 손실함수 값을 가장 작게 하는 방향을 제시한다.
3. 매개변수 갱신
가중치 매개변수를 기울기 방향으로 아주 조금 갱신한다.
4. 반복
1~3을 반복한다.
1. 배치
배치 : 하나로 묶은 입력 데이터
ex) MNIST에는 0~9의 글씨가 60,000개 있다. 이 중 10,000개의 테스트 데이터를 불러온다. 이 10,000개를 100개씩 묶는다.
mnist파일과 load_mnist, sample_weight.pkl : github.com/WegraLee/deep-learning-from-scratch
import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
def get_data():
(x_train, t_train), (x_test, t_test) = load_mnist(normalize = True, flatten = True, one_hot_label = False)
return x_test, t_test
def init_network():
with open("sample_weight.pkl", "rb") as f:
network = pickle.load(f)
def predict(network, x):
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, W3) + b3
y = softmax(a3)
return y
x, t = get_data()
network = init_network()
batch_size = 100
accuracy_cnt = 0
for i in range(0, len(x), batch_size):
x_batch = x[i:i+batch_size]
y_batch = predict(network, x_batch)
p = np.argmax(y_batch, axis=1)
accuracy_cnt += np.sum(p == t[i:i+batch_size])
print("Accuracy:",float(accuracy_cnt)/len(x))
get_data : MNIST 데이터 중 10,000개를 불러옴.
init_network : pkl 파일에 저장되어있는 가중치 값을 불러옴 (계산된 것)
predict : 데이터 x와 network(가중치 + 편향)을 sigmoid 함수 (활성화 함수)를 이용해 예측을 진행한다. softmax 함수를 이용해 예측 결과 출력
2. 손실 함수
손실 함수 : 최적의 매개변수 값을 찾는 지표
- 오차제곱합 (Sum of Squares for Error, SSE)
( y : 신경망의 출력값, t : 정답 레이블 (원-핫 인코딩인 경우), k : 데이터 차원 수 )
(원-핫 인코딩 : 가장 확률 높은 것 1, 나머지 0으로 처리한 것)
def SSE(y, t):
return 0.5 * np.sum((y-t)**2)
- 교차 엔트로피 오차 (Cross Entropy Error, CEE)
(log = ln, 자연로그)
def CEE(y, t):
delta = 1e-7
return -np.sum(t * np.log(y + delta))
=> 두 경우 모두 오차 작을 수록 (0에 가까울수록) 정답일 확률 높음
3. 매개변수 기울기 구하기
- 경사법 : 최적의 매개변수를 찾을 때 사용 => 기울기를 이용해 손실 함수의 최솟값을 찾자.
=> 수치해석을 이용해 극솟값, 극댓값 혹은 안장점을 구하면 된다. (기울기가 0인 곳을 찾자)
ex) 경사 강하법 (최솟값, 극솟값을 찾자.)
def numerical_gradient(f, x):
h = 1e-4 # 0.0001
grad = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
idx = it.multi_index
tmp_val = x[idx]
x[idx] = float(tmp_val) + h
fxh1 = f(x) # f(x+h)
x[idx] = tmp_val - h
fxh2 = f(x) # f(x-h)
grad[idx] = (fxh1 - fxh2) / (2*h)
x[idx] = tmp_val # 값 복원
it.iternext()
return grad
def gradient_descent(f, init_x, lr=0.01, step_num=100):
x = init_x
for i in range(step_num):
grad = numerical_gradient(f, x)
x -= lr*grad
return x
numerical_gradient : 매개변수가 n개인 f를 x에 대해 편미분 구함 (df/dx, d:partial)
gradient_descent : f에 경사 강하법 시행, lr = learning rate (학습률), 미분값을 0.01배 시킨다. step_num : 시행횟수
'딥러닝' 카테고리의 다른 글
오차역전파법 구현 (0) | 2021.01.14 |
---|---|
오차역전파법 - Affine, Softmax 구현 (0) | 2021.01.14 |
오차역전파법 - 활성화 함수 계층 구현하기 (0) | 2021.01.14 |
오차역전파법 - 계산 그래프 (0) | 2021.01.13 |
신경망 학습 알고리즘 구현 (0) | 2021.01.12 |