일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 역전파
- 순전파
- 딥러닝
- 소프트맥스 함수
- 파이썬
- PHP
- 설치
- 기울기
- AdaGrad
- flag
- 책
- 백준
- HTML
- C언어
- Apache2
- 코딩
- 오차역전파법
- PostgreSQL
- 우분투
- FastAPI
- picoCTF
- CTF
- 신경망 학습
- PICO CTF
- 리뷰
- sgd
- 아파치
- Python Challenge
- 신경망
- Python
- Today
- Total
Story of CowHacker
딥러닝 2.8 신경망 본문
이제 신경망의 추론 처리에 대해 알아 볼것이다.
MNIST 데이터 셋을 가지고 추론을 수행하는 신경망을 구현해볼거다.
먼저 MNIST데이터에 대해 자세히 설명하자면
첫째 MNIST의 데이터셋은 0부터 9까지의 숫자 이미지로 구성된다.
둘째 MNIST의 이미지 데이터는 28 x 28 크기의 회색조 이미지다.
셋째 MNIST의 이미지 데이터의 각 픽셀은 0에서 255까지의 값을 취한다.
자, 이제 신경망의 추론을 수행해보자.
이 신경망은 입력층 뉴런을 784개, 출력층 뉴런을 10개로 구성한다.
입력층 뉴런이 784개인 이유는 이미지 크기가 28 x 28 = 784 이기 때문이다.
출력층 뉴런이 10개인 이유는 이문제가 0에서 9 까지의 숫자를 구분하는 것이기 때문이다.
은닉층은 총 두 개다.
첫 번째 은닉층에는 50개의 뉴런을 배치하고,
두 번째 은닉층에는 100개의 뉴런을 배치할것이다.
이유는 그냥 임의로 정한 값일 뿐이다.
어서 파이썬으로 코드를 짜보겠다.
import sys, os
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as num
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 = num.dot ( x, W1 ) + b1
z1 = sigmoid ( a1 )
a2 = num.dot ( z1, W2 ) + b2
z2 = sigmoid ( a2 )
a3 = num.dot ( z2, W3 ) + b3
y = softmax ( a3 )
return y
일단 크게 함수 3개를 정의 했다.
get_data 함수는 앞에서 언급했듯이 MNIST 데이터셋을 가져오는 역할을 한다.
init_network 함수는 pickle 파일인 sample_weight.pkl에 저장된 학습된 가중치 매개변수를 읽는 역할을 한다.
predict 함수도 앞에서 언급한적이 있는데 입력 신호를 출력으로 변환하는 처리 과정을 모두 구현하는 역할을 한다.
이제 위 함수 3개를 써서 신경망에 의한 추론을 구현해보고 또 그 추론의 정확도 평가를 해보겠다.
x, t = get_data ()
network = init_network()
accuracy_cnt = 0
for _ in range ( len ( x ) ):
y = predict ( network, x [ _ ] )
p = num.argmax ( y ) # 확률이 가장 높은 원소의 인덱스를 얻는다.
if p == t [ _ ]:
accuracy_cnt += 1
print ( " Accuracy: " + str ( float ( accuracy_cnt ) / len ( x ) ) )
코드 해석을 해보면
MNIST 테이터 셋을 얻고 네트워크를 생성한다.
다음 for 문을 돌며 x에 저장된 이미지 데이터를 1장씩 꺼내 predict 함수로 분류한다.
predict 함수는 각 레이블의 확률을 넘파이 배열로 반환한다.
ex) [ 0.1, 0.3, 0.2, ...., 0.04 ] 같은 배열이 반환 될때, 이미지 숫자가 0일 확률이 0.1%, 1일 확률이 0.3%... 식으로 해석한다.
그후 num.argmax 함수로 이 배열에서 값이 가장 큰 원소의 인덱스를 구한다.
신경망이 예측한 답변과 정답 레이블을 비교하여 맞힌 숫자 ( accuracy_cnt ) 를 세고, 이를 천제 이미지 숫자로 나눠 정확도를 구한다.
위 코드를 실행 시키면 Accuracy:0.9352 가 나오는데 93.52%라는 뜻이다.
이상으로 신경망의 추론 처리에 대해 알아보았다.
'공부 > 딥러닝' 카테고리의 다른 글
딥러닝 3.0 신경망 학습 (0) | 2020.08.11 |
---|---|
딥러닝 2.9 신경망 (0) | 2020.08.10 |
딥러닝 2.7 신경망 (0) | 2020.08.06 |
딥러닝 2.6 신경망 (0) | 2020.08.05 |
딥러닝 2.5 신경망 (0) | 2020.08.04 |