Story of CowHacker

딥러닝 2.3 신경망 본문

공부/딥러닝

딥러닝 2.3 신경망

Cow_Hacker 2020. 8. 3. 15:53
728x90

3층 신경망 구성

 

입력층 ( 0층 ) -> 첫 번째 은닉층 ( 1층 ) 3개 -> 두 번째 은닉층 ( 2층 ) 2개 -> 출력층 ( 3층 ) 2개

그림1

그림 1에서 x1,x2는 입력층이고,  y1,y2 는 출력층이다 중간에 아무것도 안 적힌 상자들은 은닉층 들이다.

 

 

 

 

 

 

 

그림2

그림 2는 입력층의 뉴런 x2에서 다음 층의 뉴런으로 향하는 선 위에 가중치를 표시하고 있다.

 

 

 

 

 

 

그림 2의 과정을 표기한 밑의 그림 3을 본다.

그림3

 

 

그림 3에서 w오른쪽 위에는 ( 1 )이 붙어있는데 이것은 1층의 가중치를 뜻하는 것이다.

w의 오른쪽 밑 첫 번째 숫자인 1은 다음 층의 1번째 뉴런을 뜻하고,

w의 오른쪽 밑 두 번째 숫자인 2는 앞 층의 2번째 뉴런을 뜻한다.

 

해석을 해보면 앞 층의 2번째 뉴런 ( x2 ) 에서 다음 층의 1번째 뉴런 ( a1^(1) ) 으로 향할 때의 가중치라는 것이다.

 

 

 

 

 

 

각 층의 신호 전달 구현하기

 

그림4

그림4 에서는 편향을 뜻하는 뉴런 1 이 추가됐다.

편향은 오른쪽 아래 인덱스가 하나밖에 없다는 것에 주의한다.

 

 

 

 

 

먼저 a1 ^ ( 1 ) 을 수식으로 나타 내본다.

a1 ^ ( 1 ) 은 가중치를 곱한 신호 두 개와 편향을 합해서 계산한다.

 

그림 5

 

 

여기서 행렬의 곱을 이용하면 1층의 가중치 부분을 간소화시킬 수 있다.

 

 

그림6

 

 

그림6은 그림5를 간소화시킨 식이다.

 

 

 

 

 

 

 

 

그림7

그림 7은 행렬화를 자세히 표현한 것이다.

이제 위 행렬화 한 것을 넘파이의 다차원 배열을 사용해서 구현해본다.

 

 

 

 

 

import numpy as num

 

X = num.array ( [ 1.0, 0.5 ] )

W1 = num.array ( [ [ 0.1, 0.3, 0.5 ], [ 0.2, 0.4, 0.6 ] ] )

B1 = num.array ( [ 0.1, 0.2, 0.3 ] )

 

print ( W1.shape ) # ( 2, 3 )

print ( X.shape ) # ( 2, )

print ( B1.shape ) # ( 3, )

 

A1 = num.dot ( X, W1 ) + B1

 

print ( A1 )

 

 

 

 

 

 

이어서 1층의 활성화 함수에서의 처리를 볼 것이다.

 

 

 

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

 

그림8

그림8 에서 a는 가중치 합 ( 가중 신호와 편향의 총합 ) 이다.

h()는 활성화 함수다.

z는 활성화 함수로 변환된 신호다.

여기에서는 시그모이드 함수를 사용한다는 전제다.

 

그림8을 파이썬으로 구현해본다.

 

import numpy as num

 

X = num.array ( [ 1.0, 0.5 ] )

W1 = num.array ( [ [ 0.1, 0.3, 0.5 ], [ 0.2, 0.4, 0.6 ] ] )

B1 = num.array ( [ 0.1, 0.2, 0.3 ] )

 

def sigmoid ( x ):

    return 1 / ( 1 + num.exp ( -x ) )

 

A1 = num.dot ( X, W1 ) + B1

 

Z1 = sigmoid ( A1 )

 

print ( A1 )

print ( Z1 )

 

 

 

 

 

 

 

 

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

 

그림9

그림9는 1층에서 2층으로 신호를 전달하는 과정을 나타 낸 것이다.

그림9를 파이썬으로 구현해본다.

 

 

 

 

 

import numpy as num

 

X = num.array ( [ 1.0, 0.5 ] )

W1 = num.array ( [ [ 0.1, 0.3, 0.5 ], [ 0.2, 0.4, 0.6 ] ] )

B1 = num.array ( [ 0.1, 0.2, 0.3 ] )

 

W2 = num.array ( [ [ 0.1, 0.4 ], [ 0.2, 0.5 ], [ 0.3, 0.6 ] ])

B2 = num.array ( [ 0.1, 0.2 ] )

 

def sigmoid ( x ):

    return 1 / ( 1 + num.exp ( -x ) )

 

A1 = num.dot ( X, W1 ) + B1    

 

Z1 = sigmoid ( A1 )

 

print ( Z1.shape )

print ( W2.shape )

print ( B2.shape )



A2 = num.dot ( Z1, W2 ) + B2

Z2 = sigmoid ( A2 )

 

print ( A2 )

print ( Z2 )

 

 

 

 

이로써 신경망의 구성에 대해 알아보았다.

그리고 각 층의 신호전달을 보고 그것을 식으로 표현해보는 실습 ( 행렬화로 식을 간소화도 해봤다. ) 도 해봤다.

마지막엔 입력층에서 1층으로의 신호전달과, 1층에서 2층으로의 신호전달 과정을 보고 파이썬으로 구현을 해보았다.

 

다음은 2층에서 출력층으로 신호 전달을 해볼 것인데, 그것까지 하기엔 많은 내용이 한 번에 담길까 이까지 하려고 한다.

728x90

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

딥러닝 2.5 신경망  (0) 2020.08.04
딥러닝 2.4 신경망  (0) 2020.08.03
딥러닝 2.2 신경망  (0) 2020.07.26
딥러닝 2.1 신경망  (0) 2020.07.26
딥러닝 2.0 신경망  (0) 2020.07.25
Comments