본문 바로가기

딥러닝

7. CNN - VGG, Resnet 예제 코드

https://colab.research.google.com/drive/1pxmIrnCbG7J3vFm2RWtrv2K-UfTT45IR

 

Google Colaboratory

 

colab.research.google.com

 

1. 구현

 

 논문 발전 순서를 작성할때, Alexnet -> GoogleNet -> VGG -> Resnet 순서대로 작성을 했습니다. Alexnet은 초창기 논문에다가, 사실 구현하기에 직관적이지 않고, GoogleNet도 Inception Module이 꽤나 복잡합니다. 그래서 보기에 간단하면서도 성능이 좋은 VGG와 Resnet을 구현하게 되었습니다.

 

2. 데이터 (Cifar10)

 

 이전 구현 코드에서는 Mnist라는 아주 기본적인 데이터 셋을 사용했습니다. CNN을 1 layer만 쌓아도 정확도가 98~99%가 달성이 되죠. 그래서 복잡한 모델을 사용하기 시작하면 사실 모델의 성능을 구분하기가 쉽지 않습니다. 그래서 훈련시키기 좀더 어려운 데이터 셋을 찾게 되었습니다.

 그 중에서 Tensorflow 내부에서 제공하는 Cifar 10 데이터를 사용하였습니다. 관련 주소는 https://www.cs.toronto.edu/~kriz/cifar.html입니다. 

 

 코드 내부에도 설명을 적어두었지만, Cifar 데이터는 비행기, 새, 말, 트럭 등 총 10개의 대분류가 있고, 각각의 대분류에 10개의 소분류가 있어서 총 100개의 label이 있습니다. 그 중 Cifar 10는 대분류로 labeling을 해둔 데이터 입니다. Mnist는 흑백 데이터 이지만, Cifar는 컬러데이터로 RGB라는 3개의 채널이 있습니다.

 

 즉 숫자라는 공통점을 가진 분류 대신에 분류의 범위가 좀 더 넓어졌고, 채널의 수가 늘어남으로써 input 데이터 자체도 복잡해졌습니다. 좀 더 복잡한 데이터를 사용해서 훈련하고 싶으시다면 Cifar 100 데이터도 추천 드립니다.

 

 

3. 모델 구조 - VGGNet

 

 기존 VGGNet 논문에서 활용한 이미지 크기는 224*224*3 입니다. 반면 Cifar 데이터는 이미지 크기가 32*32*3 입니다. VGGNet에는 Pooling이 총 5번 사용되는데, 이 모델을 그대로 Cifar에 적용시킨다면 이미지가 너무 축소되는 경향도 있고, Cifar 이미지에 적용시키기에는 모델이 너무 크다고 생각했습니다. 그래서 모델의 크기와 필터수를 축소했습니다.

 모델의 성능은 아래의 성능과 비교해보는 것도 괜찮겠네요. 나름 준수한 듯 합니다.

4. 모델 구조 - Resnet

 

 Resnet도 위의 설명과 마찬가지로 그대로 적용시키기에는 너무 heavy해서 toy modeling 느낌으로 진행했습니다.   Resnet은 단순히 Conv2D layer를 8개 쌓은 모델, 그리고 똑같이 8개를 쌓았지만 중간 중간 skip connection으로 연결한 두 모델을 비교해보았습니다.

 보시다시피 Skip Connection만 추가해주어서 파라메터의 차이는 없습니다. 그리고 아래는 두개의 모델을 각각 훈련시킨 결과 입니다.

 Skip Connection의 유무가 굉장히 크게 나온 결과 입니다. 위의 모델은 훈련이 아예 진행이 안되고 있는 반면, 아래의 모델은 그래도 훈련이 되어가고 있습니다. 하지만 VGGNet 보다 훈련 소요시간이 많이 들면서, loss도 높게 나왔습니다. 제 생각으로는 Pooling의 유무가 크다고 생각했습니다.

 Pooling을 사용하면 파라메터의 갯수도 줄어들고, Pooling 자체가 일반화의 성능을 조금 높여주는 경우도 있기 때문입니다. 그래서 Pooling이 존재하는 Resnet toy model도 만들어보았습니다.

 

 Pooling을 총 두번 추가했고, 그에따라서 파라메터가 1/4 정도로 줄어들었습니다.

 보시다시피 loss가 떨어지고 정확도가 올라가는 등, 성능이 개선된 것 처럼 보이네요.