

먼저, pruning을 구현하기 위해 baseline model을 구현하는 것이 첫번째이다.
baseline model에서 parameter를 filter 단위로 pruning하며 실험을 진행할 것이다.
baseline으로는 논문에서 제시한 VGG-16 on CIFAR-10 by Zagoruyko(2015) 의 code를 사
용할 것이다.
하지만 여기서 문제가 발생했다.
VGG-16 on CIFAR-10 by Zagoruyko(2015) 의 code는 오래된 code이므로 lua language로 작성되어 있었다.
Lua code를 실행시켜보려 했지만, 나의 cuda version이 lua code를 지원하지 않아서
논문에서 사용한 baseline model을 손쉽게 얻을 수 없었다.
그래서 VGG-16 on CIFAR-10 by Zagoruyko(2015) 의 code에서 preprocessing, hyperparameter을 어떻게 했는지 참고하여
직접 VGG16 on CIFAR-10을 구현하였다.
또한 논문에서는 Zagoruyko의 code에 한가지 조건을 적용하여 만들었다고 했다.
Zagoruyko는 특별한 preprocessing없이 horizontal flip만 해서 92.45%의 accuracy를 달성했다고 했다.
그래서 직접 구현한 VGG16 model의 accuracy가 92.45%에 근접하게 나오는 것을 목표로 두었다.

첫번째 experiment라는 의미로 00_vgg16_baseline_exp1/ directory 밑에
train.py file을 생성하여 training code 개발을 완료하였다.

논문에서의 Figure2. (b) :
Figure2. (b)는 13개의 conv layer들마다 해당 layer의 filter들을
각각 [10, 20, 30, 40, 50, 60, 70, 80, 90, 95]% pruning하고 난 후에,
model의 accuracy를 다시 측정한 것을 visualization한 것이다.
그래프를 보면 알 수 있듯이,
논문에서는 뒷쪽의 conv layer들이 pruning에 robust하고,
앞쪽의 conv layer들이 pruning에 sensitive하다고 주장했다.

논문에서 주장한 대로,
뒷쪽의 conv layer들이 pruning에 보다 robust한지 알아 보기 위해
이미 학습해두었던 baseline model parameter를 이용하여
Figure 2. (b)와 똑같이 visualization해보았다.
나의 Figure2. (b) :
결과는 논문에서와 같이 뒷쪽의 conv layer들이 pruning에 더욱 sensitive한 것을 알 수 있었다.

Figure 2. (b)에서처럼 pruning하는 것은 똑같지만,
20 epoch만큼 retrain시킨 후에 accuracy를 측정하여 visuliazation한 것이 (c)이다.
논문에서의 Figure 2. (c) :
retrain을 시켜보니, 더욱 두드러지게 확인할 수 있는 것이
역시나 뒷쪽 conv layer들이 pruning에 매우 robust하다는 것이다.

직접 구현한 Figure 2. (c) :
논문과 유사한 graph 형태가 그려진 것을 확인할 수 있었다.

논문에서 Table 1.에 VGG-16에 대한 3가지 model에 대해서
Error%, #FLOPs, FLOPs Pruned%, #Parameters, Parameters Pruned%를 비교하였다.




baseline에 비해
34.12% 감소된 #FLOPs와 64% 감소된 #Params의 pruned model을 이용하여
baseline model의 error rate에서 단 +0.27%만 증가한 것으로 보아,
baseline model과 pruend model의 성능 차이는 거의 없다고 생각할 수 있다.
또한 논문과 유사한 결과가 나왔으니, pruning filter 구현을 성공적으로 한 것 같다.