Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 파이썬
- 버퍼오버플로우
- 신경망구현
- 정보보안
- 활성화함수파이썬
- BOF
- 백준알고리즘
- 달고나bof
- 소프트맥스함수
- 항등함수
- 스트림암호
- 인공지능
- 밑바닥부터시작하는딥러닝
- FTZlevel10
- 8086CPU레지스터
- 신경망
- C알고리즘
- 보안
- c언어
- 신경망파이썬
- 신경망 학습
- 머신러닝
- 알고리즘
- C언어알고리즘
- C언어 알고리즘
- 딥러닝
- 백준
- 파이썬신경망
- BOJ
- 딥러닝파이썬
Archives
- Today
- Total
HeeJ's
[04] 신경망(2) 본문
넘파이 다차원 배열을 이용해 3층 신경망 구현하기
3층 신경망의 입력층(0층)은 2개, 첫 번째 은닉층(1층)은 3개, 두 번째 은닉층(2층)은 2개, 출력층(3층)은 2개의 노드로 구성된다.
더보기
import numpy as np
X = np.array([1.0,0.5])
# X=(x1,x2)의 입력값을 나타낸다.
W1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
#W는 가중치를 나타내는 값이다.
#0층에서 1층으로 가는 화살표의 값이기 때문에 2차원 배열을 이용한다.
B1 = np.array([0.1,0.2,0.3])
#B는 편향을 나타낸다.
print(W1.shape) #(2, 3)
print(X.shape) #(2, )
print(B1.shape) #(3, )
#.shape는 튜플을 반환한다.
A1 = np.dot(X, W1) + B1
결과를 확인하면 W1은 2X3행렬, X는 원소가 2개인 1차원 배열이라는 것을 알 수 있다.
여기에서도, W1과 C의 대응하는 차원의 원소 수가 일치한다.
이제 은닉층(1층)에서, 활성화 함수가 처리된다.
이를 조금 더 자세하게 그림으로 살펴보면 위와 같이 나타나게 된다.
은닉층에서의 가중치 합(가중 신호 + 편향)을 a로 표기하고
활성화 함수h()로 변환된 신호를 z로 표기한다.
여기에서, 활성화 함수(h())로 시그모이드 함수를 사용한다.
이를 파이썬으로 이어서 구현해보면
더보기
import numpy as np
import matplotlib.pylab as plt
#시그모이드 함수
def sigmoid(x):
return 1 / ( 1 + np.exp(-x))
X = np.array([1.0,0.5])
# X=(x1,x2)의 입력값을 나타낸다.
W1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
#W는 가중치를 나타내는 값이다.
#0층에서 1층으로 가는 화살표의 값이기 때문에 2차원 배열을 이용한다.
B1 = np.array([0.1,0.2,0.3])
#B는 편향을 나타낸다.
print(W1.shape) #(2, 3)
print(X.shape) #(2, )
print(B1.shape) #(3, )
#.shape는 튜플을 반환한다.
A1 = np.dot(X, W1) + B1
#1층에서의 활성화함수 처리
Z1 = sigmoid(A1)
print(A1) # [0.3, 0.7, 1.1]
print(Z1) # [0.57444252, 0.66818777, 0.75026011]
이렇게 나타낼 수 있다.
위와 마찬가지로 1층에서 2층으로 가는 과정을 구현해보면
더보기
import numpy as np
import matplotlib.pylab as plt
#시그모이드 함수
def sigmoid(x):
return 1 / ( 1 + np.exp(-x))
X = np.array([1.0,0.5])
# X=(x1,x2)의 입력값을 나타낸다.
W1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
#W는 가중치를 나타내는 값이다.
#0층에서 1층으로 가는 화살표의 값이기 때문에 2차원 배열을 이용한다.
B1 = np.array([0.1,0.2,0.3])
#B는 편향을 나타낸다.
print(W1.shape) #(2, 3)
print(X.shape) #(2, )
print(B1.shape) #(3, )
#.shape는 튜플을 반환한다.
A1 = np.dot(X, W1) + B1
#1층에서의 활성화 함수 처리
Z1 = sigmoid(A1)
print(A1) # [0.3, 0.7, 1.1]
print(Z1) # [0.57444252, 0.66818777, 0.75026011]
#1층에서 2층으로 신호 전달
W2 = np.array([[0.1, 0.4], [0.2,0.5], [0.3,0.6]])
B2 = np.array([0.1,0.2])
print(Z1.shape) # (3, )
print(W2.shape) # (3, 2)
print(B2.shape) #(2, )
A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)
이 부분이 추가가 된다.
이는 1층의 출력(Z1)이 2층의 입력이 된다는 정도의 차이를 가진다.
2층에서 출력층으로 신호 전달할 때의 차이점은 활성화 함수라고 할 수 있다.
더보기
import numpy as np
import matplotlib.pylab as plt
#시그모이드 함수
def sigmoid(x):
return 1 / ( 1 + np.exp(-x))
X = np.array([1.0,0.5])
# X=(x1,x2)의 입력값을 나타낸다.
W1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
#W는 가중치를 나타내는 값이다.
#0층에서 1층으로 가는 화살표의 값이기 때문에 2차원 배열을 이용한다.
B1 = np.array([0.1,0.2,0.3])
#B는 편향을 나타낸다.
print(W1.shape) #(2, 3)
print(X.shape) #(2, )
print(B1.shape) #(3, )
#.shape는 튜플을 반환한다.
A1 = np.dot(X, W1) + B1
#1층에서의 활성화 함수 처리
Z1 = sigmoid(A1)
print(A1) # [0.3, 0.7, 1.1]
print(Z1) # [0.57444252, 0.66818777, 0.75026011]
#1층에서 2층으로 신호 전달
W2 = np.array([[0.1, 0.4], [0.2,0.5], [0.3,0.6]])
B2 = np.array([0.1,0.2])
print(Z1.shape) # (3, )
print(W2.shape) # (3, 2)
print(B2.shape) #(2, )
A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)
#2층에서 출력층으로의 신호 전달
W3 = np.array([[0.1,0.3], [0.2,0.4]])
B3 = np.array([0.1,0.2])
A3 = np.dot(Z2, W30 + B3)
Y = A3
이 경우엔 출력층의 활성화 함수로는 항등 함수가 사용된다.
하지만 출력층의 활성화 함수는 풀고자 하는 문제의 성질에 따라 변한다.
ex) 회귀 - 항등 함수 / 2클래스 분류 - 시그모이드 함수 / 다중 클래스 분류 - 소프트맥스 함수
출처 : 밑바닥부터 시작하는 딥러닝
'<Machine Learning>' 카테고리의 다른 글
[06] 신경망 학습 (1) (0) | 2020.11.04 |
---|---|
[05] 항등 함수와 소프트맥스 함수 (0) | 2020.10.07 |
[03] 신경망(1) (0) | 2020.09.30 |
[02] 퍼셉트론 (0) | 2020.09.25 |
[01] 러닝 모델(Learning Model) :: Machine Learning (0) | 2020.08.17 |