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

No Limitation

[Pytorch] 손글씨 분류 in ANN 본문

ML & DL & RL

[Pytorch] 손글씨 분류 in ANN

yesungcho 2022. 2. 27. 19:06

본 포스팅은 유원준 님의 Pytorch로 시작하는 딥러닝 입문 교재를 참고로 했음을 밝힙니다. 

https://wikidocs.net/61046

 

 

다중 퍼셉트론을 사용하여 손글씨를 분류하는 모형을 짜보자

 

처음에는 sklearn 패키지에 있는 손글씨 데이터 load_digits()을 사용하여 글씨를 분류하는 작업을 수행해보자

 

다음과 같이 digits을 로드하고 나면 본 데이터 안에는 이미지를 나타내는 데이터와 레이블 정보가 들어간 데이터가 구성이 되어 있다. 

 

예를 들어 첫 번째 샘플의 경우 0이 들어있고 다음과 같이 데이터가 들어가있음을 확인할 수 있다.

 

총 데이터는 1797개의 샘플로 구성이 되어 있으며 다음과 같이 이미지를 출력해서 확인해보면 

 

다음과 같이 데이터들이 들어있음을 확인할 수 있다.

 

digits.images의 경우 8 x 8 형태의 행렬로 이미지가 들어있지만 학습을 위해

이를 64차원의 벡터로 만들어주어야 하는데

이는 digits.data에 들어있음을 확인할 수 있다.

 

 

고로 이 데이터를 활용하여 학습 데이터 X와 Y를 구축한다.

이제 이러한 데이터를 바탕으로 신경망 모형을 짜보자

 

활성화 함수는 ReLU를 사용하였으며 optimizer로는 Adam, 그리고 오차 함수로는 CrossEntropy함수를 사용하였다.

 

이를 바탕으로 학습을 수행하면 다음과 같다.

 

 

그렇다면 마찬가지로 sklearn에서 제공하는 mnist 손글씨 데이터에도 마찬가지로 분류 모델을 짜보자

 

우선 fetch_openml 데이터에서 mnist 데이터를 불러온 다음

데이터를 확인해보면 다음과 같이 데이터가 픽셀 별로 0-255값을 갖는 것을 확인할 수 있다.

 

또한 정답 레이블은 string형태로 들어가있음을 확인할 수 있다.

string 형태로 되어 있는 데이터 값을 integer로 바꾸어주고 0-255로 되어 있는 픽셀값을 0-1로 정규화를 거쳐준 다음, X, Y를 구축해준다.

 

그럼 본격적으로 데이터를 학습 데이터, 테스트 데이터로 분할을 해주어 학습을 수행한 다음 테스트 데이터에서의 예측력을 측정해보는 과정을 거쳐보자

 

우선 데이터를 분할한 다음, bach size와 shuffle 적용을 위해 data loader로 변경해준다. 

 

다음으로 신경망 아키텍처를 설계한다. 기존 방법만이 아닌, add_module을 통해서도 추가가 가능하다.

 

다음으로 손실함수와 optimizer를 설정해준 다음에 학습을 수행할 train 함수를 정의한다. 

model.train(), model.eval() 메서드에 대해서도 익숙해지자

 

다음으로 테스트를 수행하는 함수도 정의해준다.

 

처음 학습 전에 바로 초기에 설정한 가중치 값을 바탕으로 test 데이터를 바로 예측한 결과는 다음과 같다.

 

정확도는 약 12%로 매우 낮은 성능을 가짐을 알 수 있다.

 

반면, 학습을 수행한 다음은 어떻게 될지 확인해보자

 

96%의 정확도를 가짐을 확인할 수 있다.

 

학습한 모델을 바탕으로 아무 데이터를 예측해도 바로 예측이 되는 지를 확인해보자

 

예측이 잘 됨을 확인할 수 있다.