본문 바로가기
AI/DL

『밑바닥부터 시작하는 딥러닝』 Chapter 3. 신경망

by Night Fury 2024. 12. 19.
반응형
사이토 고키, 『밑바닥부터 시작하는 딥러닝』, 개앞맵시, 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)))
반응형

댓글