우잉's Development

Chapter3. 신경망 2 본문

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

Chapter3. 신경망 2

우잉이 2022. 1. 25. 15:02
728x90
반응형

3.4 3층 신경망 구현하기 

3.4.3 구현 정리

init_network() 함수는 가중치와 편향을 초기화 하고 이들을 딕셔너리 변수인 network에 저장합니다. 

그리고 forward() 함수는 입력신호를 출력으로 변환하는 처리과정을 모두 구현합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.5 출력층 설계하기

기계학습 문제 

 ① 분류 : 데이터가 어느 클래스에 속하는지 문제 ex) 항등함수

 ② 회귀 :  입력데이터에서 (연속적인) 수치를 예측하는 문제 ex) 소프트맥스 함수

신경망은 분류와 회귀 문제 모두 이용할 수 있습니다. 다만 어떤 문제냐에 따라 출력층에 사용하는 활성화 함수가 달라집니다. 

3.5.1 항등함수와 소프트맥스 함수 구현하기

항등함수는 입력을 그대로 출력합니다. 즉, 입력과 출력이 항상 같습니다. 한편, 분류에서 사용하는 소프트맥스 함수(softmax function)의 식은 다음과 같습니다.

\(y_k = {{e^{a_k}} \over {\sum_{i=1}^n e^{a_i}}}\)

\(n\) : 출력층의 뉴런수, \(y_k\) : 그중 k번째 출력, \(a_k\) : 입력신호



항등함수


소프트맥스함수

소프트 맥스 함수를 python으로 구현하면 다음과 같다.

 

 

 

 

 

 

3.5.2  소프트 맥스 함수 구현시 주의 사항

- 표현 할 수 있는 수의 범위가 한정되어 (\(e^{1000}=\infty\)) 너무 큰 값은 표현 할 수가 없다.

  => 오버 플로 (overflow)

- 계선된 수식 

\(y_k\) = \({{e^{a_k}} \over {\sum_{i=1}^n e^{a_i}}} \) = \({C{e^{a_k}} \over {C\sum_{i=1}^n e^{a_i}}} \)

           =  \({{e^{a_k+logC}} \over {\sum_{i=1}^n e^{a_i + logC}}} \)

           =  \({{e^{a_k+C^{'}}} \over {\sum_{i=1}^n e^{(a_i + C^{'})}}} \)

즉, \({{e^{a_k}} \over {\sum_{i=1}^n e^{a_i}}} \) = \({{e^{a_k+C^{'}}} \over {\sum_{i=1}^n e^{(a_i + C^{'})}}} \) 이므로 \(C'\)에 어떤 값이 들어와도 결과는 바뀌지않는다 . => 오버 플로 막음

 

3.5.3 소프트맥스 함수의 특징

총합이 1이 나온 것을 옆에서 확인 할 수 있습니다. 

이 것은 확률로 해석이 가능하다는 뜻입니다.

주의할 점은 소프트맥스 함수를 적용해도 각 원소의 대소관계는 변하지 않습니다.

왜냐하면 지수함수 \(e^x\)가 단조 증가 함수이기 때문입니다.

 

 

 

3.5.4 출력층의 뉴런 수 정하기

출력층의 뉴런 수는 풀려는 문제에 맞게 적절히 정해야 합니다. 분류에서는 분류하고 싶은 클래스 수로 설정 하는 것이 일반적입니다.

 

3.6 손글씨 숫자 인식 

3.6.1 MNIST 데이터 셋

MNIST 데이터셋은 0부터 9까지의 숫자 이미지로 구성됩니다. 훈련 이미지가 60000장, 시험 이미지가 10000장 준비가 되어 있습니다. 

MNIST의 이미지 데이터는 28x28 크기의 회색조 이미지 (1채널)이며, 각 픽셀은 0에서 255까지의 값을 취합니다. 

 

그림에서 위에 두줄은 코랩에서 드라이브에 옮겨놓은 mnist데이터셋을 불러오기 위한 과정입니다. 그리고 sys.path.appen(' __ ')괄호 안에 는 각자 mnist데이터셋이있는 경로를 붙여주시면 됩니다. 

그리고 다음 코드에는 임포트한 load_mnist로 MNIST 데이터셋을 읽습니다. load_mnist가 MNIST데이터를 받아와야 하니 최초 실행 시에는 인터넷에 연결된 상태여야 합니다. load_mnist함수는 읽은 MNIST데이터를 "(훈련이미지, 훈련 레이블), (시험 이미지, 시험 레이블)" 형식으로 반환 합니다. 인수로는 normalize, flatten, one_hot_label 세 가지를 설정합니다. 세 인수 모두 bool형태입니다. 

1) normalize 는 입력이미지의 픽셀값을 0.0~1.0 사이의 값으로 정규화할 지 정합니다. 

    False로 설정하면 입력 이미지의 픽셀은 원래 값 그대로 0~255사이 값을 유지합니다.

2) flatten 은 입력이미지를 1차원 배열로 만들지 정합니다.

    False로 설정하면 입력이미지를 1x28x28의 3차원 배열로, True로 설정하면 784개의 원소로 이뤄진 1차원 배열로 저장

3) one_hot_encoding 은 원-핫 인코딩 형태로 저장할지 정합니다. 

  (원-핫 인코딩이란, 정답을 뜻하는 원소만 1로 저장하고 나머지는 0으로 저장합니다. )

 

주의사항!! flatten = True로 설정해  읽어 들인 이미지는 1차원 넘파이 배열로 저장되있다는 것!!

그래서 이미지를 표시할 때는 원래 형상인 28x28크기로 다시 변형해야 합니다. 

reshape()메서드사용하여 변환 하고 넘파이로 저장된 이미지 데이터를 PIL용 데이터 객체로 변환해야하며 이 변환은 Image.fromarray()가 수행합니다.

3.6.2 신경망의 추론처리

MNIST데이터셋가지고 추론을 수행하는 신경망을 구현할 차례입니다. 

신경망 - 입력층 뉴런 784개 (=28 x 28)

          - 출력층 뉴런 10개 (0~9)

          - 은닉층 2개 (첫 번째 은닉층: 50개 뉴런, 두 번째 은닉층: 100개 뉴런 배치) -> 50과 100은 임의로 정한 값

3.6.3 배치 처리

전체적으로 보면 원소 784개로 구성된 1차원 배열 (원래는 28X28인2차원 배열)이 입력되어 마지막에는 원소가 10개인 1차원 배열이 출력. -> 이미지 데이터 1장만 입력했을 때의 처리 흐름.

이미지가 100장일경우 100개를 묶어 predict()함수에 한번에넘긴다. 그래서 x의 형상을 100X784로 바꿔서 100장 분량의 데이터를 하나의 입력데이터로 표현 합니다. 이처럼 하나의 묶음 입력데이터를 배치(batch)라 합니다.  

  

 

728x90
반응형

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

Chapter4 신경망 학습2  (0) 2022.02.04
Chapter4 신경망 학습  (0) 2022.01.28
Chaper 3 신경망  (2) 2022.01.20
Chapter2. Perceptron(퍼셉트론)  (0) 2022.01.18
Comments