transfer learning, bottleneck 연습..1

CNN, Transfer learning

이미지를 인식하고 분류하는 분야는 딥러닝의 복귀와 함께 엄청나게 발전해왔다. 인간의 능력은 이미 뛰어넘었고 이제는 얼마나 간단한 모델로 많은 카테고리를 정확하게 분류하냐로 발전을 하고 있다. 이걸 가능케 한 건 CNN이라는 이미지 분류 모델이다. CNN은 그 네트워크를 만든 팀이나 특징을 따서 LeNet, GoogLeNet, ResNet 등등 여러가지 버전이 있다. ImageNet 대회에서 좋은 성능을 보이는 네트워크가 나올 때마다 이름이 하나씩 생기는 듯하다. 예를 들어 VGG16은 1000개의 카테고리를 분류하는데 92.5%의 성능을 보인다. 하지만 이런 고성능의 CNN은 개인이 처음부터 만들기는 힘들다. 엄청난 컴퓨터 연산 능력이 필요하고 데이터가 엄청나게 필요하다. 위에 예를 든 VGG16은 1400만개의 이미지를 가지고 학습을 하였고 밑에 그림에서 보듯 개인 컴퓨터에서 돌리기엔 꽤 큰 네트워크이다.

다행히 이런 거대한 네트워크를 그냥 갖다 쓸 수 있다. 딥러닝은 학습을 하면서 weight와 bias를 찾아가는 과정이다. 결국 마지막에 남는건 학습을 마친 weight와 bias이다. 이 값만 가지고 있으면 이미지를 분류할 수 있다. 이것이 딥러닝의 장점 중 하나인데 학습에서는 오랜 시간이 드는 반면, 분류를 할 때는 단지 저장된 값에다 계산만 하면 되어 분류가 빠르다.

또 이 모델의 중간을 잘라서 가져올 수 있다. 1400만장으로 학습된 VGG16을 가져와 나의 CNN 모델을 끼우는 방식이다. 내가 가진 데이터가 없을 때, 이 방법을 사용하면 거대한 네트워크의 힘을 빌릴 수 있다. 모델을 가져올 때는 bottleneck이라는 방법을 사용한다. bottleneck은 마지막 Fully connected layer를 뺀 나머지 layer를 가져오는 방법이다. 거대한 레이어들이 이어져 있고 마지막으로 fully connected layer로 이어지면서 네트워크는 병목처럼 좁아지는데 bottleneck은 이 fully connected layer를 말한다. 

Dog classifying

내가 이번에 해 본 코드는 Kaggle의 개 분류이다. Transfer learning은 처음 해보는 거라 캐글의 유명 커널을 따라하였고 Keras를 사용했다. ResNet으로 테스트를 해보고 VGG16모델로 학습을 했다.

Resnet으로 분류한 에시