본문 바로가기

딥러닝

8. CNN - 1x1, 3x3, 5x5, 예제 코드

 

 앞으로의 포스팅에서는 CNN에 관련 되어 있는 몇가지 구조에 대해서 설명을 하고, 실험도 해본 결과를 포스팅 해보겠습니다.

 

1. Factorizing Convolutions.

 

 VGGNet, GoogleNet 등을 보시면 알게되는 개념 입니다.

 위의 사진은 stride가 1, 5x5 filter size를 가진 conv layer 하나를, stride 1이고 3x3 filter size를 가진 두개의 conv layer로 인수분해가 가능하다는 얘기 입니다. 이와 비슷하게 7x7 layer를 3x3 layer 3개로 만들수도 있겠죠.

5x5 layer의 parameter 수
3x3 layer 두개의 파라메터수

 위의 두 사진은 5x5 layer를 3x3 layer 두개로 구성했을 때의 차이를 보여줍니다. 파라메터 수가 줄어들었습니다. 또한 딥러닝의 장점 중인 하나인 비선형성에 대한 모델링을 더 해줄 수 있습니다. 3x3 layer 두개에 각각 활성화 함수를 적용해서 말이죠. 논문들에서는 실험적으로 이렇게 인수분해한 Conv layer가 더 좋은 성능을 보여준다고 합니다.

 그래서 저도 간단하게 실험해보았습니다.

 

2. Factorizing Convolutions 실험

 

 데이터는 이전 논문 실험처럼 Cifar 10 입니다.

 이렇게 간단하게 모델을 구성했을때 성능을 비교해보았습니다. 실제로 같은 훈련을 시켰을때 loss나 정확도 측면에서 3x3 filter 조합이 훨씬 좋게 나옵니다. 

 

3. 1x1 convolution 조합과 실험

 위는 Inception module을 다룬 논문에서 나온 개념입니다. Factorizing Convolution과 그 장점이 유사합니다. 파라메터의 수는 줄이면서, 비선형성을 추가하는 등의 이유로 성능은 줄지 않는다 입니다. 이 이유로 Inception Module에 1x1 conv layer가 다 붙어있습니다.

 

 그래서 몇가지 실험을 해보았습니다. 5x5 layer와 3x3 layer 각각 앞에 1x1 conv layer를 붙여봤습니다. 1x1 conv layer의 filter수는 그 뒤에 있는 5x5, 3x3 layer에 비해 작게 설정했습니다. 그랬더니 성능의 저하가 좀 있었습니다. 블로그에 그 결과를 모두 올리기에는 사진이 너무 많아지기 때문에 직접 확인해보시면 좋을 것 같네요.

 

 논문의 이미지나 모델 보다 이미지 크기도 작고, 모델의 크기도 작기 때문에 결과를 그대로 받아들이기에는 무리가 있습니다만, 참고 용도는 될 것 같습니다.

 

4. 전체 코드(colab)

 

https://colab.research.google.com/drive/1mKsJzkfai225yuhDUKeqdQxPceGLw1eU