상세 컨텐츠

본문 제목

[Deep Learning-딥러닝]Multi Classification - 다범주분류 및 소스프맥스 소스 구현

Artificial Intelligence

by [성운] 2019. 8. 19. 22:24

본문

이번 포스팅에는 범주 분류 문제의 예제로는 그림에 쓰여진 숫자를 판독하는 기능을 구현해보겠습니다. 선행 학습으로 다 범주 분류 https://ynebula.tistory.com/32가 필요합니다. Tensorflow library를 이용한 구현은 다음 포스팅에서 구현할 예정입니다.

학습 내용

1에서 5까지 된 숫자를 구분하는 모델을 구현하겠습니다. 판독할 이미지는 다음과 같이 가로, 셀로 각각 5개의 픽셀로 구성된 5*5 크기의 숫자 이미지를 고려합니다.

학습 데이터

5개의 범주를 분류하므로 출력층의 노드는 5개로 구성하고, 활성함수는 소프트맥스 함수를 사용합니다. 이미지의 크기가 5*5 행렬이므로 입력 노드의 개수는 25개로 구성합니다. 신경망 모델은 하나의 은닉층 노드의 개수는 50, 활성함수는 시그모이드 함수를 사용합니다. 학습 규칙은 SGD방식으로 구현합니다.

신경망 구성

신경망 구성

활성함수(sigmoid, softmax) 선언 및 구현

활성함수 구현

softmax() 함수와 sigmoid() 함수의 지수함수 구현을 위해 numpyimport 합니다. numpy는 아래 구현에서 리스트 및 행렬 연산에서도 사용됩니다.

훈련(multiClass)

multiClass 구현

multiClass 함수의 파라메터 W1은 입력층-은닉층의 가중치 행렬, W2는 은니층-출력층의 가중치 행렬을 나타내는 변수입니다. X는 학습 데이터의 입력 데이터, D는 학습 데이터의 정답을 담고 있는 변수입니다. multiClass는 학습 데이터를 하나 꺼내 델타 규칙에 따라 가중치 갱신값(dw1, dw2)을 계산하고, 이 값으로 신경망의 가중치를 새로 갱신합니다. 

은닉층 관련 변수들(hidden_v, hidden_y, hidden_delta)은 신경망 그림처럼 형태를 변경해야 하므로배열로 선언한 뒤 reshape()을 수행해야 합니다. 마찬가지로 출력층 변수도 형태를 변경해야 합니다.

softmax를 사용하면서 출력층의 노드가 여러 개가 되었습니다. 즉 정답의 차원이 1차원이 아니라 분류되는 범주의 차원으로 변경됩니다. 따라서 오차-출력층에서 d 행렬타입을 1 5열에서 5 1열로 꼭 변경해야 합니다.

출력층의 활성함수가 Cross entropy 함수의 학습 규칙이므로 error delta이 값이 같습니다.

그 외 소스 내용은 앞 포스팅 내용과 같으므로 생략하겠습니다.

훈련 데이터 및 multiClass 호출

훈련데이터 및 multiClass 호출

변수 X를 보면 흰색 픽셀은 0으로, 검정색 픽셀은 1로 바꿔서 이미지를 2차원 행렬로 변환시켰습니다. 변수 D에는 신경망이 출력해야 하는 정답이 행 단위로 들어 있습니다. 변수 D의 값을 살펴보면 5개 출력 노드에 관해 one-hot 인코딩 방식으로 정답을 구성했다는 사실을 알 수 있습니다.

X 2차원 이미지 데이터가 층층이 쌓인 형태로 들어 있습니다. 5*5*% 3차원 행렬입니다. 이를 2차원 행렬을 5 25 크기로 벡터로 바꿔줘야 합니다. Reshape() 함수가 이런 변환을 수행합니다. reshape() 함수는 일단 만들어진 배열의 내부 데이터는 보존한 채로 형태만 변경합니다. 예를 들어 12개의 원소를 가진 1차원 행렬은 3x4 형태의 2차원 행렬로 만들 수 있습니다.

모델 훈련 결과 확인

훈련 결과 확인

모델 검증 - Test

모델 검증

Source

전체 소스는 아래 git에서 확인할 수 있습니다.

https://github.com/ynebula/First-Contact-with-Books/blob/master/Deep_Learning/MultiClass.ipynb

 

도움이 되셨다면 공감 부탁 드립니다.

감사합니다.

관련글 더보기

댓글 영역