본문 바로가기

개발/딥러닝

1 - MNIST 모델 학습

자, 이제 본격적으로 모델을 학습해 봅시다.

 

Conv2D로 CNN을 돌려서 그림의 모양을 학습해 주고 Flatter으로 쭉 펴 준 다음 Dense로 10개의 출력을 가진 모델을 만들 것입니다.

 

 

? 난리났습니다.

 

우선 에러 코드를 봅시다.

 

여기 보면 이런 내용이 있습니다.

OMP: Error #15: Initializing libiomp5, but found libiomp5md.dll already initialized.

 

이는 라이브러리 끼리 충돌을 일으켜서 생기는 문제입니다. 커널을 재시작한 다음

 

import os

os.environ['KMP_DUPLICATE_LIB_OK']='True'

 

를 제일 먼저 실행해 줍니다.

 

 

이렇게 쭉 진행하면 에러가 나지 않습니다.

 

이어서 진행해 봅시다. model이 어떤 식으로 생겼는지 출력해 봅시다.

 

처음 입력이 28*28*1인 이유는 (세로)*(가로)*(색상)이기 때문입니다. Conv2D는 3차원을 입력으로 하기 때문에 이렇게 만들어 주었습니다.

 

세번째 줄 conv2d_1의 param 수는 1820개입니다. 이는 10(이전 레이어의 커널 수) * 20(현재 레이어의 커널 수) * 3*3(필터 크기) + 20(현재 레이어의 커널 마다 있는 bias) 해서 나옵니다. 즉, 필터를 구성하는 3*3 파라미터가 이전 커널 * 현캐 커널 수만큼 있고 추가로 bias가 있는 것입니다.

두번째 줄 conv2d는 1*10*3*3+10으로 나옵니다.

마지막 dense의 param은 11520(이전 레이어의 크기)*10(현재 레이어의 크기)+10(현재 레이어의 노드 마다 있는 bias)해서 115210이 됩니다.

 

모델이 학습을 하기 위해서는 지금 얼마나 못하고 있는지를 알려줘야 합니다. 그리고 어떤 식으로 학습하고 있는지도 알려줘야하죠. 저희는 지금 label이 3,5 이런 식으로 되어 있는데 이것을 [0,0,0,1,0,0,0,0,0,0], [0,0,0,0,0,1,0,0,0,0]로 바꿀 것입니다. 각 라벨이 서로 어떠한 관계도 없기 때문에 별개로 나누어 줄 것입니다. 이런 식으로 출력이 될 때는 categorical_crossentropy 라는 기준을 사용합니다.

그리고 학습 방식은 adam을 사용할 것입니다. 기본적으로는 기울기를 계산하고 그 방향으로 나아가는 것인데 안본 곳을 빠르게 변화하고 많이 본 곳은 조금씩만 변화한다던가 하는 다양한 학습 기법들이 있습니다. adam은 보편적으로 많이 쓰이는 학습 방식으로 adam을 쓰도록 하겠습니다.

그리고 metrics=['accuracy']를 이용해서 정확도를 추가로 확인해 보겠습니다.accuracy는 모델의 학습과는 관련이 없지만 실제로 정답을 얼마나 맞추었는지 확인할 수 있습니다.

 

학습하지 건에 출력 데이터를 조금 바꿔줘야 겠네요. to_categorical을 이용해 ont_hot encode를 해줍시다.

 

이제 모델한테 어떤 식으로 학습할 것인지 알려주고

 

무엇을 얼마나 학습할 것인지 알려줍니다. 입력은 noize_image, 출력은 train_labels로 학습을 하고 test_noize_image, test_labels로 시험을 칠 것입니다. 이 과정을 epochs=5번 반복하고 학습 과정을 잘 보여달라고(verbose=2)합니다.

 

학습은 상당히 잘 되었습니다. 근데 시간이 너무 오래 걸리죠.

 

왜냐하면 GPU를 안썼거든요. 평소 2%인 CPU가 학습 시작하고 20%로 올랐습니다. 

 

 

우선 GPU 쓰는 건 나중에 보도록 하고 성능부터 확인해 봅시다. 

 

 

CNN이 정말 좋긴 한가 보네요. 한번만에 거의 학습이 완료되고 5번만에 학습이 완료되었습니다.

결과를 한번 확인해 봅시다.

 

0부터 시작하니까 배열의 8번째 값이 9.9999118e-01로 가장 큰 것을 볼 수 있습니다.

 

과열 때문인지 메모리 때문인지 모르겠지만 이 글 쓰면서 컴퓨터가 한번 죽었습니다. 다음 포스트에서 GPU를 이용해 학습시키고 이런 일을 방지해 보겠습니다.