이미지 = CNN(Convoutional Neural Network)
사실 CNN을 활용한 이미지 분류는 이전 Keras 소개 포스트에서 자세히 다뤘다.
어떻게 CNN을 이용해서
무엇을 학습하는지,
어떤 방식으로 학습하는지,
등에 대해서 설명하려고 한다.
사실 CNN을 통한 이미지 분류 방법은
너무나도 유명한 MNIST 필기체 인식의 성능 향상을 이끌어 낼 수 있다.
여기서!
중요한 점은 바로 무엇을 학습하였는가?! 이다.
도대체!
그 필기체 숫자 이미지에서 무엇을 학습하였길래!
사람의 눈보다 정확하고 빠르게 분류 할 수 있었던 것일까?
그렇다면!
어떤 방식으로 학습이 진행되었는가!? 에 대한 답도 찾아야 할 것이다.
우선 Keras에서 CNN을 구현하는 방법은 너무나도 다양하고
이미 잘 알려져 단순히 검색을 해봐도 코드를 찾을 수 있다.
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
너무나도 간단하지 않은가?!
처음 이걸로 이미지를 학습하고 분류 할 수 있다는게 사실 믿겨지지 않았다.
하지만!
맛보기 코드다.
사실 인터넷에 매우 흔하게 떠돌아 다니는 자료이다.
빨간 박스안에 있는 레이어가 이미지의 특성을 찾고 일반화하는 역할을 수행한다.
3D 텐서를 10개의 레이블 값으로 나태내기 위해서는 1D 텐서로 풀어주어야 하기 때문에,
flatten_1(None, 576) 을 추가하였다.
576 은 3 * 3 * 64 값이다.
분류는 SOFTMAX 를 이용한다. (보편적으로)
이제 슬슬 깊이 들어가야 하는데,
그 전에!
세 가지만 기억을 하고 넘어가야 한다.
1. 이미지 인식, 분류에 대한 학습은 데이터 증식이 중요하다.
2. CNN의 레이어는 상위층(아래로)에서 점점 추상적이고 사람의 눈으로는 알 수 없는 영역의 특징들을 학습하게 되는데, 이 것이 모델의 일반화 성능에 지대한 영향을 준다.
3. 기 학습된 모델(Pretrained Model)을 활용하여 적은 데이터를 효과적으로 학습하고 과적합에 빠지지 않는 모델을 생성 할 수 있다.
위 3가지 특징이 이전 포스트에서 소개한 얼굴인식 전 과정의 핵심이다.
CNN을 주제로!
다시 한 번,
얼굴 인식 모델을 만들고, 세부적인 튜닝 방향에 대해서 알려주겠다.
끝.