<Machine Learning>
[04] 신경망(2)
meow00
2020. 10. 7. 02:15
넘파이 다차원 배열을 이용해 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클래스 분류 - 시그모이드 함수 / 다중 클래스 분류 - 소프트맥스 함수
출처 : 밑바닥부터 시작하는 딥러닝
반응형