머신러닝

MNIST 문자 “3” 대상 CNN Filtering, Pooling 예제 코드

coding art 2021. 7. 10. 16:39
728x90

CNN이 지금까지 다루어 보았던 NN 코드보다 구조도 복잡하고 길이가 길어 처음 접할 경우 상당히 복잡하다고 느낄 수도 있을 것이다. 이미 임의의 숫자 이미지 예제를 통해 CNN 코드 구조 자체는 소개를 하였으나 아무래도 임의의 숫자 이미지라고 하는 것은 우리 감각에 와 닿지는 않는 듯하다.

 

완전한 MNIST 문제의 CNN 인식 코드를 사용하기 전에 MNIST의 문자 하나를 끄집어 내어 필터를 적용해서 원 이미지가 어떤 형태로 처리되는지 관찰해 보고 아울러 MAX Pooling 기법도 적용하여 어느 정도까지 이미지가 변화되어 나가는지 관찰해 보자.

 

MNIST 문자의 종류가 불과 09 이므로 어느 문자를 택해도 큰 문제는 없다. 하지만 MNIST CNN을 가시적으로 볼 수 있는 방법은 이 방법 외에는 있을 수 없음이 자명하다.

 

다음은 TensorFlow 코드에서 MNIST 데이타베이스를 불러와 그중에서 하나의 샘플 “3”을 불러와 matplotlib 에 의해 그래픽 출력하는 루틴이다.

다음 코드는 샘플 “3”에 대하여 3x3 웨이트 값을 가지는 필터를 사용하여 2X2로 즉 오른쪽으로 2칸씩 아래쪽으로 2칸씩 스트라이딩 하여 5개의 필터를 적용하여 얻어지는 이미지이다. padding 조건이 ‘SAME“이기 때문에 필터링된 이미지가 원 이미지의 매트릭스의 크기를 그대로 유지한다. 아직까지는 “3”이라는 특징이 그대로 보존되고 있음을 알 수 있다.

필터링에 이어 Max Pooling 알고리듬 적용이 이루어진다. Padding 조건 ‘SAME’ 하에서 이미지 크기를 그대로유지하면서 Max Pooling kernel 사이즈 2x2를 돌려 최대 값을 뽑아 이미지를 구성해 보면 아직 “3” 의 특징을 유지하기 하지만 어찌 보면 “F” 와 비슷하기도 하다. 하지만 MNIST 학습 범위는 09dp 한정하여 라벨링하므로 알파벳 문자 “F” 와 혼동할 일은 없을 것이다. 하지만 숫자에 더하여 알파벳까지 인식 범위를 넓히려면 필터의 종류와 Pooling 기법도 함께 개발해야 할 것이다.

필터링 이미지와 Pooling 처리를 위한 코드는 다음의 주소를 참조하기 바란다.

https://github.com/hunkim/DeepLearningZeroToAll

 

포함된 폴더 중에 ipynblab-11-0-cnn_basics.ipynb 쥬피터 파일을 불러오면 강의 파일을 볼 수 있다. 쥬피터 편집기에서는 코드 블록 별 방식으로도 실행이 가능하다.

 

쥬피터 모듈은 아나콘다 설치 시에 묻어오므로 tensorFlow 와 함께 설치해 두는 것이 좋을 듯하다. 다음 그림은 아나콘다에 설치된 모듈들의 시작바 메뉴사례다.