상세 컨텐츠

본문 제목

[파이썬][딥러닝] 3층 순방향 신경망 구현하기

Python

by 경밤 2020. 3. 31. 01:37

본문

반응형

입력 - 은닉층 - 은닉층 - 결과 형태인 3층 순방향 신경망을 구현해보도록 하겠습니다.

저번 퍼셉트론에서 와 마찬가지로 입력과 가중치의 곱에 가중치의 합을 결과로 내놓아서, 그것을 다시 활성화 작업을 처리 한 후 까지를 한개의 뉴런이라고 설명 드렸습니다. 즉, H(hidden) 뉴런 한개 한개에 있어서 앞의 층의 결과 값 혹은 입력값을 처리한 것은 간추린 것이라고도 말 했습니다.

각 층마다 X, W, B, A, Z를 두겠습니다. X * W + B 는 입력 행렬과 가중치 행렬의 곱에 편향 벡터 연산을 수행하는 것입니다. 주의할점은, X와 W의 곱의 순서를 지키지 않으면 다른 값이 나올 뿐더러, 각각 X의 열의 길이와 W의 행의 갯수가 일치해야만이 행렬곱 연산이 수행가능합니다.

A는 X*W+B의 결과고, Z는 활성화 함수를 거친 A입니다. 위의 3층 신경망에서 H안에서 A와 Z가 구해져, Z의 갑이 다음 층의 뉴런에게는 입력이 되겠죠?

1. 구현

입력값 X와 1층인 입력층에서 은닉층으로 갈때 곱해질 가중치와 더해질 편중들을 작성합니다..

import numpy as np

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

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

a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)

활성화 함수로 시그모이드 함수를 채택하였습니다. 그리고 첫번째 은닉층에 해당하는 모든 뉴런들의 계산을 Numpy의 Dot으로 행렬곱을 해, 1층의 뉴런 3개의 출력을 모두 가져왔습니다.

(* 편중과 가중치 모두 그저 아무 숫자입니다 연연하지 마세요! )

이렇게 값이 나왔습니다 왼쪽부터 오른쪽 까지 그림을 그려보겠습니다. 아래의 그림 처럼 은닉층 한개가 통과되어 결과를 반환 한것이 됩니다.

다음 층으로 넘어가 보겠습니다. 이번에는 뉴런이 2개로 작아졌습니다. 그런데 입력은 3개인데, 그럼 가중치를 어떻게 둬야 할까요?

W2 = np.array([[0.3,0.2], [0.4, 0.3], [0.2, 0.3]])
b2 = np.array([0.2,0.3])

a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)

W2와 같이 행3개, 열이 2개인 형태로 작성 해주시면 됩니다. 왜냐하면 대응하는 차원과 행렬곱했을때 결과로 나오는 행렬의 크기는 , W2의 행과 열에서 나오기 때문인데요, 간단히 말해서 W2와 곱하는 배열의 열이 3이니까 W2의 행도 맞춰줘야하는게 맞고요, 결과로 나오는 행렬은 2개로 계획 했기 때문에 열이 2개인 가중치 행렬로 완성 했습니다.

이번에는 np.dot 에서 첫번째 인수로 x대신 z1을 사용했습니다. 위에서 말한대로 z1이 첫번째 은닉층의 입력에 대한 결과임으로 이것을 이어나가서 써야 신경층이 되는 겁니다.

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

a3 = np.dot(z2, W3) + b3
y = a3

마지막 단계인 출력층입니다. 마찬가지로 행렬 크기 맞춰서 가중치 고려해주시는게 정말 주의해야할 점이라고 누누히 강조 드립니다. y = a3라고 활성화 함수 없이 했습니다. 출력층의 활성화 함수는 풀고자하는 '문제'의 성질에 맞춥니다. 가령 예를 들면 이진 클래스 분류에는 시그모이드 함수를 출력층의 활성화 함수로써 사용합니다. 다른 문제로는 다중 클래스 문제가 있는데, 이것은 말 그대로 0혹은 1을 판단하던 이진분류 말고, 더 많은 클래스를 분류하는 데에는 소프트맥스 함수를 사용합니다. 사실 다중분류는 이진분류를 포괄합니다. 

결론적으로 우리는 y를 출력 할 수 있게 되었습니다.

 

이렇게 여러개의 신경 층들을 건너가며 최종적으로 가장 정제된 데이터를 얻을 수 있었습니다.

 

감사합니다 아래는 최종 코드입니다.

 

반응형

관련글 더보기