일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- HTML
- PostgreSQL
- 순전파
- C언어
- 오차역전파법
- 우분투
- 파이썬
- FastAPI
- Python
- 리뷰
- 소프트맥스 함수
- CTF
- AdaGrad
- flag
- PICO CTF
- 아파치
- Apache2
- picoCTF
- 딥러닝
- 코딩
- Python Challenge
- 백준
- 신경망
- 역전파
- 설치
- PHP
- 신경망 학습
- 기울기
- sgd
- 책
- Today
- Total
Story of CowHacker
딥러닝 2.3 신경망 본문
3층 신경망 구성
입력층 ( 0층 ) -> 첫 번째 은닉층 ( 1층 ) 3개 -> 두 번째 은닉층 ( 2층 ) 2개 -> 출력층 ( 3층 ) 2개
그림 1에서 x1,x2는 입력층이고, y1,y2 는 출력층이다 중간에 아무것도 안 적힌 상자들은 은닉층 들이다.
그림 2는 입력층의 뉴런 x2에서 다음 층의 뉴런으로 향하는 선 위에 가중치를 표시하고 있다.
그림 2의 과정을 표기한 밑의 그림 3을 본다.
그림 3에서 w오른쪽 위에는 ( 1 )이 붙어있는데 이것은 1층의 가중치를 뜻하는 것이다.
w의 오른쪽 밑 첫 번째 숫자인 1은 다음 층의 1번째 뉴런을 뜻하고,
w의 오른쪽 밑 두 번째 숫자인 2는 앞 층의 2번째 뉴런을 뜻한다.
해석을 해보면 앞 층의 2번째 뉴런 ( x2 ) 에서 다음 층의 1번째 뉴런 ( a1^(1) ) 으로 향할 때의 가중치라는 것이다.
각 층의 신호 전달 구현하기
그림4 에서는 편향을 뜻하는 뉴런 1 이 추가됐다.
편향은 오른쪽 아래 인덱스가 하나밖에 없다는 것에 주의한다.
먼저 a1 ^ ( 1 ) 을 수식으로 나타 내본다.
a1 ^ ( 1 ) 은 가중치를 곱한 신호 두 개와 편향을 합해서 계산한다.
여기서 행렬의 곱을 이용하면 1층의 가중치 부분을 간소화시킬 수 있다.
그림6은 그림5를 간소화시킨 식이다.
그림 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 에서 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는 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층에서 출력층으로 신호 전달을 해볼 것인데, 그것까지 하기엔 많은 내용이 한 번에 담길까 이까지 하려고 한다.
'공부 > 딥러닝' 카테고리의 다른 글
딥러닝 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 |