반응형
사이토 고키, 『밑바닥부터 시작하는 딥러닝』, 개앞맵시, O'Reilly-한빛미디어(2017), p63-106.
활성화 함수(activation function): 입력 신호의 총합을 출력 신호로 변환하는 함수
- 신경망에서는 활성화 함수로 비선형 함수를 사용해야 함
- 선형 함수를 이용하면 신경망의 층을 깊게 하는 의미가 없어짐
- 출력층의 활성화 함수는 풀고자 하는 문제의 성질에 맞게 정의
- 회귀: 항등 함수 ➡️ 입력 그대로 출력
- 이진 클래스 분류: 시그모이드 함수
- 다중 클래스 분류: 소프트맥스 함수
활성화 함수 종류
- 계단 함수(step function): 임계값을 경계로 출력이 바뀜
- 시그모이드 함수(sigmoid function)
$$h(x) = {1\over {1+exp(-x)}}$$
- ReLU(Rectified Linear Unit): 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력
- 소프트맥스 함수(softmax function)
- 오버플로 문제를 해결하기 위해 입력 신호 중 최댓값을 빼서 계산할 수 있음
- 출력은 [0, 1] 실수, 총합은 1
- 소프트맥스 함수의 출력을 '확률'로 해석할 수 있음
$$y_k = {exp(a_k)\over {\sum^n_{i=1}exp(a_i)}} $$
행렬곱: np.dot, np.matmul: https://jimmy-ai.tistory.com/104
PIL(Python Image Libary) 모듈: 이미지 표시 기능
import sys, os
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image
def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
img = x_train[0]
label = t_train[0]
print(label) # 5
print(img.shape) # (784,)
img = img.reshape(28, 28) # 형상을 원래 이미지의 크기로 변형
print(img.shape) # (28, 28)
img_show(img)
정규화(normalization): 데이터를 특정 범위로 변환하는 처리
전처리(pre-processing): 신경망의 입력 데이터에 특정 변환을 가하는 것
배치(batch): 하나로 묶은 입력 데이터
- 배치 처리를 수행함으로써 큰 배열로 이뤄진 계산을 하는데, 컴퓨터에서는 큰 배열을 한꺼번에 계산하는 것이
분할된 작은 배열을 여러 번 계산하는 것보다 빠름 - 이유
- 수치 계산 라이브러리 대부분이 큰 배열을 효율적으로 처리할 수 있도록 고도로 최적화 됨
- 커다란 신경망에서는 데이터 전송이 병목으로 작용하는 경우가 있는데, 배치 처리로 부하를 줄일 수 있음
(느린 I/O를 통해 데이터를 읽는 횟수가 줄어, 빠른 CPU or GPU로 순수 계산을 하는 비율이 높아짐)
import sys, os
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax
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)
return network
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:" + str(float(accuracy_cnt) / len(x)))
반응형
'AI > DL' 카테고리의 다른 글
『밑바닥부터 시작하는 딥러닝』 Chapter 4. 신경망 학습 (0) | 2024.12.22 |
---|---|
『밑바닥부터 시작하는 딥러닝』 Chapter 2. 퍼셉트론 (0) | 2024.12.16 |
『밑바닥부터 시작하는 딥러닝』 Chapter 1. 헬로 파이썬 (1) | 2024.12.13 |
댓글