Deep Learning/밑바닥부터 시작하는 딥러닝

DL - #3, 신경망

KimTory 2022. 2. 4. 02:09

신경망 가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 있다!!

 

신경망을 그림으로 나타내면 다음과 같으며 크게 입력층, 은닉층, 출력층 이렇게 3개로 구분된다.

→ Input : 입력층

→ Hidden : 은닉층

→ Output : 출력층

가장 왼쪽 줄이  입력층(Input Layer) , 중간 줄이  은닉층(Hidden Layer) , 맨 오른쪽 줄이  출력층(Output Layer)

책에서는 위의 신경망 구조를 '2층 신경망이라고 표현

 

신경망에선 "활성화 함수"라는 개념이 등장

활성화 함수란 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할을 수행한다.

 

  • 신경망에서 자주 이용되는 활성화 함수 (모두 비선형)
    • 시그모이드 함수
       exp(-x)는 e^-x를 뜻하며, e는 자연상수로 2.7182...의 값을 갖는 실수
      def sigmoid(x):
          return 1 / (1 + np.exp(-x))
      Sigmoid

    • ReLU 함수 : 입력이 0을 넘으면 그대로 출력, 아니면 0을 출력
      def relu(x):
          return np.maximum(0, x)
      ReLU 함수 그래프


  • 일반적으로 이용되는 출력층의 활성화 함수
    • 회귀 문제
      • 항등 함수
    • 이진 분류 문제
      • 시그모이드 함수
    • 다중 분류 문제
      • 소프트맥스 함수
      • 단, 오버플로 문제를 막기 위해 계산 시에 입력 신호 중 최댓값을 빼줘야 함
        def softmax(a):
            c = np.max(a)
            exp_a = np.exp(a-c) # 오버플로 대책, Max 를 빼줌
            sum_exp_a = np.sum(exp_a) 
            y = exp_a / sum_exp_a
            
            return y

** 선형 함수를 활용화 함수로 사용하면 신경망의 층을 깊게 하는 의미가 없어진다.

 

<참고>

  • 기계학습은 크게 "학습" "추론"의 두 단계를 거쳐서 이루어짐
    • 학습 데이터를 사용하여 가중치 매개변수를 학습
    • 추론 단계에서는 앞서 학습한 매개변수를 사용하여 입력 데이터를 분류
  • 추론 단계에서는 출력층의 소프트맥스 함수를 생략하는 것이 일반적
  • 그러나 신경망을 학습시킬 때 출력층에서 소프트맥스 함수를 사용
  • 신경망 활성화 함수로 Sigmoid, ReLU 함수 같은 매끄럽게 변화하는 함수를 이용
    • 배치(Batch)
      • 입력 데이터를 묶은 것을 의미함 (즉, 하나로 묶은 데이터)
        • ex) 이미지 데이터의 경우, 이미지가 지폐처럼 다발로 묶여있다고 생각하면 됨
      • 배치 처리를 수행함으로써 큰 배열로 이루어진 계산을 하게 되는데, 컴퓨터에서는 큰 배열을 한꺼번에 계산하는 것이 분할된 작은 배열을 여러 번 계산하는 것보다 빠름 (즉, 배치 처리를 하면 속도 측면에서 효율적)
    • MNIST DATA SET
MNIST: 손글씨 숫자 이미지 집합


0부터 9까지의 숫자 이미지로 구성
훈련 이미지가 60000장, 시험 이미지가 10000장 준비됨
훈련 이미지로 모델을 학습. 시험 이미지들을 얼마나 정확하게 분류하는지를 평가함

MNIST의 이미지 데이터는 28 X 28 크기의 회색조 이미지, 각 픽셀 값은 0~255.

각 이미지에는 실제 의미하는 숫자가 레이블로 붙어 있음.

import sys, os
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록 설정
from dataset.mnist import load_mnist

# MNIST DATA LOAD
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

# 각 데이터의 형상 출력
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000,)
print(x_test.shape)  # (10000, 784)
print(t_test.shape)  # (10000,)


def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    #pil_img.show()
    plt.imshow(np.array(pil_img))
    
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

# LOAD DATA SET 중 0번째 INDEX DATA 추출 (DATA + LABEL)
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)

Output / Show

 

'Deep Learning > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

DL - #5-1, 오차역전파법  (0) 2022.02.04
DL - #4 -2, 신경망 학습  (0) 2022.02.04
DL - #4 -1, 신경망 학습  (0) 2022.02.04
DL - #2, 퍼셉트론  (0) 2022.02.04
DL - 퍼셉트론 정리  (0) 2022.01.27