728x90
반응형

편향과 활성화 함수를 생략하고 가중치만 갖는 신경망 구현

 

[그림1] 출처 : https://yeowool0217.tistory.com/503

 

 

파이썬 코드

# 편향과 활성화 함수를 생략하고 가중치만 갖는 신경망

import numpy as np

x = np.array([1,2])
print(x.shape)

w = np.array([[1,3,5],[2,4,6]])
print(w)
print(w.shape)

y = np.dot(x,w)
print(y)

[그림2] 가중치만 갖는 신경망 실행 결과

 

 

3층 신경망 구현

 

3층 신경망

[그림3] 출처 : https://m.blog.naver.com/ssdyka/221295807014

 

입력층(0층)은 2개, 첫 번째 은닉층(1층) 3개, 두 번째 은닉층(2층) 2개, 출력층(3층) 2개의 뉴런으로 구성

 

 

표기법 설명

[그림4] 출처 : https://m.blog.naver.com/ssdyka/221295807014

 

 

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

[그림5] 출처 : https://m.blog.naver.com/ssdyka/221295807014

 

편향을 뜻하는 뉴런 1이 추가되었다.

 

2층 첫 번째 뉴런의 식

[그림6] 출처 : https://m.blog.naver.com/ssdyka/221295807014

 

행렬의 내적을 이용해 1층의 '가중치 부분' 간소화

[그림7] 출처 : https://m.blog.naver.com/ssdyka/221295807014

 

 

파이썬 구현

# 3층 신경망 

import numpy as np

x = np.array([1.0,0.5])
w1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]])
b1 = np.array([0.1,0.2,0.3])

print(w1.shape)
print(x.shape)
print(b1.shape)

A1 = np.dot(x,w1) + b1 # 구현 식
print(A)

[그림8] 3층 신경망 구현 결과

 

 

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

[그림9] 출처 : https://m.blog.naver.com/ssdyka/221295807014

은닉층에서의 가중치 합(가중 신호와 편향의 합)을 a로 표기하고 활성화 함수 h()로 변환된 신호를 z로 표기한다.

여기서 활성화 함수로 시그모이드 함수를 사용한다.

 

 

파이썬 코드

# 3층 신경망 

import numpy as np

x = np.array([1.0,0.5])
w1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]])
b1 = np.array([0.1,0.2,0.3])

print(w1.shape)
print(x.shape)
print(b1.shape)

A1 = np.dot(x,w1) + b1 # 구현 식
print(A)

def sigmoid(x):
    return 1/(1+np.exp(-x)) # 시그모이드 수식

z1 = sigmoid(A1)

print(A1)
print(z1)

[그림10] 입력층에서 1층을호 신호 전달 과정 실행 결과

 

 

이제 1층에서 2층의로의 신호 전달 

[그림11] 출처 : https://m.blog.naver.com/ssdyka/221295807014

 

 

파이썬 코드

# 3층 신경망 

import numpy as np

x = np.array([1.0,0.5])
w1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]])
b1 = np.array([0.1,0.2,0.3])

print(w1.shape)
print(x.shape)
print(b1.shape)

A1 = np.dot(x,w1) + b1 # 구현 식
print(A)

def sigmoid(x):
    return 1/(1+np.exp(-x)) # 시그모이드 수식

z1 = sigmoid(A1)

print(A1)
print(z1)


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)
print(W2.shape)
print(B2.shape)

A2 = np.dot(z1,W2)+ B2
print(A2)

[그림12] 1층에서 2층으로의 신호 전달 과정 실행 결과

 

 

2층에서 출력층으로의 신호 전달 

[그림13] 출처 : https://m.blog.naver.com/ssdyka/221295807014

 

 

파이썬 코드

# 3층 신경망 

import numpy as np

x = np.array([1.0,0.5])
w1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]])
b1 = np.array([0.1,0.2,0.3])

print(w1.shape)
print(x.shape)
print(b1.shape)

A1 = np.dot(x,w1) + b1 # 구현 식
print(A)

def sigmoid(x):
    return 1/(1+np.exp(-x)) # 시그모이드 수식

z1 = sigmoid(A1)

print(A1)
print(z1)


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)
print(W2.shape)
print(B2.shape)

A2 = np.dot(z1,W2)+ B2
Z2 = sigmoid(A2)
print(A2)
print(Z2)


def identity_function(x):
    return x

W3 = np.array([[0.1,0.3],[0.2,0.4]])
B3 = np.array([0.1,0.2])

A3 = np.dot(Z2,W3)+B3

Y = identity_function(A3) # 혹은 Y = A3
print(Y)

[그림14] 3층 신경망 2층에서 출력층 전달

 

 

구현 정리

 

파이썬 코드

import numpy as np


def sigmoid(x):
    return 1/(1+np.exp(-x)) # 시그모이드 수식

def identity_function(x):
    return x

def init_network():
    network = {}
    network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
    network['b1'] = np.array([0.1,0.2,0.3])
    network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
    network['b2'] = np.array([0.1,0.2])
    network['W3'] = np.array([[0.1,0.3],[0.2,0.4]])
    network['b3'] = np.array([0.1,0.2])
    
    return network


def forward(network,x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    
    a1 = np.dot(x,W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = identity_function(a3)
    
    return y

network = init_network()
x = np.array([1.0,0.5])
y = forward(network, x)
print(y)

[그림15] 3층 신경망 구현 결과

 

 

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

https://www.hanbit.co.kr/store/books/look.php?p_code=B8475831198

 

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

직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서

www.hanbit.co.kr

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기