관리 메뉴

HeeJ's

[04] 신경망(2) 본문

<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클래스 분류 - 시그모이드 함수 / 다중 클래스 분류 - 소프트맥스 함수

 

 

출처 : 밑바닥부터 시작하는 딥러닝

 

'<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