Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

0과 1 사이

[3장]행렬 곱과 3층 신경망 구현 본문

딥러닝 공부

[3장]행렬 곱과 3층 신경망 구현

고후 2021. 8. 9. 17:53

행렬 곱

기본적인 행렬 곱.

고등수학에서도 나오는 얘기지만 행렬 곱을 위해서는 차원이 맞아야 한다.

A가 m*n 행렬이라면

B는 n*l 행렬이어야 행렬 곱이 가능하다.

다시말해 A의 열의 개수와 B의 행의 개수가 같아야 한다.

여기까지는 기본적인 이야기다.

 

3층 신경망 구현

 

3층 신경망 중 입력층에서 1층으로 가는 과정을 구현했다.

다시 말해 A1 = X*W1 + B 을 구현한 것.

그런데 A1을 구하는 과정에서 B를 더하는 것 없이 두 행렬의 곱셈만으로도 구할 수 있지 않나? 싶어서 이 방법으로 해봤다. 두 행렬의 곱셈만으로 구하는 방법은 X의 맨 앞 원소를 1로 두고 W1의 첫 행을 B로 두는 것이다. 

그런데 해보니까 알겠다. 이렇게 하는것이 오히려 더 복잡하다..

 

같은 결과를 출력하지만 코드가 훨씬 이해하기 쉽다

 

위 같은 과정으로 3층 신경망 전체를 구현했더니

갑작스러운 에러 발견. 3*1 행렬과 3*2 행렬을 곱할 수 없다는 것 같다. 

 

다시 보니까 np.dot(Z1, W2)인데 np.dot(Z1*W2)라고 오타가 났던 것이다^^..

성공!

 

이제 이 코드를 책에 나온 대로 정리해보겠다.

 

import numpy as np

def sigmoid(x):
    return 1/(1+np.exp(-x))

def activate(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 = activate(A3)
    print(Y)



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

 

결과는 

[0.31682708 0.69627909] 가 나온다.

Comments