Broccoli's House

#2-(3) 신경망 : 3층 신경망 구현 본문

공부/딥러닝

#2-(3) 신경망 : 3층 신경망 구현

김콜리 2018. 1. 25. 12:28

※ 이 글의 내용은 O'REILLY의 <밑바닥부터 시작하는 딥러닝> 책을 기반으로 한다.




3층 신경망 구현




  • 신호 전달 구현

<3층 신경망>


 - 입력층(Input Layer, 0층)은 2개, 첫 번째 은닉층(First Hidden Layer, 1층)은 3개, 두 번째 은닉층(Second Hidden Layer, 2층)은 2개, 출력층(Output Layer, 3층)은 2개의 노드로 구성된 3층 신경망이다.


 (1) 입력층에서 1층으로의 신호 전달



<입력층에서 1층으로의 신호 전달>


 - 가중치 계산

X = np.array([1.0, 0.5]) # 입력값
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) # 가중치(weight)
B1 = np.array([0.1, 0.2, 0.3]) # 편향(bias)

A1 = np.dot(X, W1) + B1
# X와 W1 행렬을 내적한 다음 B1 행렬을 더한다
print(A1)

>> [ 0.3  0.7  1.1]



 - 활성화 함수

def sigmoid(x) :
return 1/(1+np.exp(-x)) # 시그모이드 함수 구현

Z1 = sigmoid(A1) # 가중치 계산값을 활성화
print(Z1)

>> [ 0.574  0.668  0.75 ]



 (2) 1층에서 2층으로의 신호 전달



<1층에서 2층으로의 신호 전달>


W2 = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]]) # 1->2 가중치(weight)
B2 = np.array([0.1,0.2]) # 1->2 편향(bias)

A2 = np.dot(Z1, W2) + B2
# 1층의 출력 Z1과 2층의 가중치 W2를 내적한 다음 B2 행렬을 더한다
Z2 = sigmoid(A2) # 2층의 가중치 계산값을 활성화

print(A2)
print(Z2)

>> [ 0.516  1.214]

>> [ 0.626  0.771]



 (3) 2층에서 출력층으로의 신호 전달 



<2층에서 출력층으로의 신호 전달>


def identity_function(x):
return x
# 활성화 함수 : 항등함수 구현

W3 = np.array([[0.1, 0.3], [0.2, 0.4]]) # 2->3 가중치(weight)
B3 = np.array([0.1, 0.2]) # 2->3 편향(bias)

A3 = np.dot(Z2, W3) + B3
# 2층의 출력과 출력층의 가중치 W3를 내적한 다음 B3 행렬을 더한다
Y = identity_function(A3) # 출력층의 가중치 계산값을 활성화

print(Y)

>> [ 0.317  0.696]


 - 함수 identity_function()는 항등 함수를 정의한 것이다. 출력층의 활성화 함수는 보통 풀고자하는 문제의 성질에 맞게 정한다. 회귀 문제에서는 항등 함수를 이용하며, 이진 분류에서는 시그모이드(Sigmoid) 함수, 다중 분류에서는 소프트맥스(Softmax) 함수를 사용하는 것이 일반적이다.




  • 구현 정리

from preamble import *

def sigmoid(x) :
return 1/(1+np.exp(-x)) # 시그모이드 함수 구현

def identity_function(x):
return x # 항등함수 구현

def init_network() :
network = {} # dictionary 데이터 타입 선언
network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]]) # 0->1 가중치(weight)
network['b1'] = np.array([0.1,0.2,0.3]) # 0->1 편향(bias)
network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]]) # 1->2 가중치(weight)
network['b2'] = np.array([0.1,0.2]) # 1->2 편향(bias)
network['W3'] = np.array([[0.1,0.3],[0.2,0.4]]) # 2->3 가중치(weight)
network['b3'] = np.array([0.1, 0.2]) # 2->3 편향(bias)

return network

def forward(network,x) : # 전방전파 함수 구현
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
# 각 변수에 dictonary에 저장되어있는 값 저장

a1 = np.dot(x,W1) + b1 # 0->1 가중치 계산
z1 = sigmoid(a1) # 0->1 활성화
a2 = np.dot(z1,W2) + b2 # 1=>2 가중치 계산
z2 = sigmoid(a2) # 1->2 활성화
a3 = np.dot(z2,W3) + b3 # 2->3 가중치 계산
y = identity_function(a3) # 2->3 활성화

return y

network = init_network()
x = np.array([1.0, 0.5]) # 입력값
y = forward(network, x) # 출력값
print(y)

>> [ 0.317  0.696]



'공부 > 딥러닝' 카테고리의 다른 글

#2-(5) 신경망 : MNIST 손글씨 숫자 인식  (1) 2018.01.30
#2-(4) 신경망 : 출력층 설계  (0) 2018.01.26
#2-(2) 신경망 : 활성화 함수  (0) 2018.01.24
#2-(1) 신경망 : 소개  (0) 2018.01.24
#1-(3) 퍼셉트론 : XOR 게이트  (1) 2018.01.23
Comments