06-9 MNIST 문자 “3” 대상 CNN Filtering, Pooling 예제 코딩

in #kr6 years ago (edited)

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

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

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

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

noname01.png

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

noname02.png

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

noname04.png

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

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

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

noname03.png

Sort:  

언젠가 이해할 날을 위하여 ^^
꾸욱 ~

Posted using Partiko iOS

저게 정말 "3"입니까? ㅎㅎ
저걸 "3"으로 인식하는게 오히려 잘못된 결과일 것 같은데... ^^

Coin Marketplace

STEEM 0.20
TRX 0.15
JST 0.029
BTC 62864.56
ETH 2538.87
USDT 1.00
SBD 2.93