AI/TensorFlow 학습

7. TensorFlow 2.x - Neural Network MNIST 예제

된다잘된다 2024. 7. 31. 13:33

참고: https://youtu.be/AyvicBsP8tE?si=037NR0QlKNBz2ve7

 

 

영상에서는 MNIST문제를 모든 컴퓨터 언어에서 처음 배우는 "Hello world!"와 같은 수준이라고 소개한다. ㅎㅎㅎ

이미지 데이터를 입력으로 사용할 때는 하나의 이미지에서 각 픽셀마다 데이터로 생각하고 1차원적으로 쭉 펴줘야 한다. MNIST 하나의 이미지는 28x28 이므로 총 784개의 픽셀로 되어있는 1x784로 만들어 주어야 한다. 

 

당연한 이야기이지만, 딥러닝 모델을 만들려고 할 때, 입력이 어떻게 생겼는지, 출력은 무엇으로 할지 등의 구조를 먼저 잡아야 한다. 여기서의 입력 데이터는 28x28 크기의 이미지이고, 이 이미지가 6만개가 있다고 한다.슬라이드의 설명에서 볼 수 있듯이 은닉층의 개수와 노드 개수는 설계자가 최적의 값을 찾아야 한다.여기서 출력은 0~9까지의 숫자를 알아맞추는 것이므로 10개가 된다.

 

영상에서 딥러닝 설계 순서에 대해 아주 잘 설명해주셨다.

 

모델에 데이터를 넣기 전에 데이터를 어떤 틀 안에 넣어서 변환하는 과정을 전처리하고 아래와 같은 정규화, 표준화, 원핫 인코딩과 같은 방법들을 사용한다.

 

이제 MNIST예제로 들어가보자.

 

MNIST 예제용 데이터는 tensorflow에서 제공하고 있다.

학습용 데이터는 60000개이고, 검증용으로는 10000개를 사용할 수 있다.

받아온 데이터를 실제 그림으로 그리면 아래와 같다.

 

이런 손글씨로 되어있는 숫자를 학습시켜서 제대로 추론하게끔 만들어보자.

 

입력 데이터를 정규화 해주고, 정답도 원핫 인코딩 해준다.

원핫 인코딩: 정답에는 0~9까지의 숫자가 들어있었는데, 이것을 array로 만들어

0일때는 첫번째 인덱스의 값은 1이고 나머지는 모두 0, [1,0,0,0,0,0,0,0,0,0]

1일때는 두번째 인덱스의 값이 1이고 나머지는 모두 0, [0,1,0,0,0,0,0,0,0,0]

...

9일때는 열번째 인덱스의 값이 1이고 나머지는 모두 0으로 표시한것이다. [0,0,0,0,0,0,0,0,0,1]

 

이제 모델을 만들고 어떻게 생겼는지 살펴보자.

여태 배우지 못한 것들이 나왔다. Flatten(), relu, softmax, Adam...

Flatten()은 2차원 배열을 1차원 배열로 만들어주는 함수이다.

activation 함수로 사용한 relu와 softmax는 뒤에 설명하도록 하자.

은닉층의 노드 개수를 100개로 출력층의 노드 개수를 10개로 하였다. 출력은 0-9까지 10가지이므로 노드를 10개로 정했고, 은닉층의 100개 노드는 임의의 값이다.

모델을 설계했으니 학습시켜보자.

 

학습한 결과로 정확도는 0.98이 되었고, 평가했을 때도 정확도가 0.98이다.

학습시 accuracy와 검증시 accuracy의 차이가 뒤로 갈수록 많이 나고 있고 이것이 overfitting에 의한다고 한다.

이게 정확히 어떤의미인지 뒤에 더 학습을 하고나면 알게 될 것이다.

 

confusion matrix를 통해 우리가 만들 모델이 어떤 데이터에 확신을 갖고 어떤 데이터는 그렇지 못한지 알아보자.

 

테스트용 데이터를 입력하여 추론한 결과를 정답과 비교해서 그린 히트맵이다.

예를 들어, 0으로 써있는 이미지중에 972개는 제대로 판별하였으나, 나머지는 3,4,6,8,9 등으로 추론하였다.이것을 맞출 확률을 구해보면 아래와 같다.

그래도 대략 98% 정도는 맞는 것으로 보인다.

 

다음 글에서는 손글씨가 아닌 그림을 가지고 무엇인지 판별하는 Fashion MNIST 예제를 다뤄보자.