안녕하세요 "pulluper" 입니다😀
오늘은 딥 뉴럴 네트워크의 레이어의 깊이(depth)를 많이 쌓아서 Imagenet에서 좋은 성능을 달성한 VGG 네트워크에 대하여 알아보겠습니다. 논문은 아래링크에서 보실 수 있습니다.
https://arxiv.org/pdf/1409.1556.pdf
논문은 간단한 supervised image classification task 이기 때문에 구현을 위해 Dataset, Model, Loss, Train, Test(evaluation) 중심으로 논문을 훑어보겠습니다.
Abstract
Abstract 부분을 읽으면 저자들의 연구 방향과 제안하는 contribution(학계의 기여)과 성능평가등이 간략하게 나와있습니다. 이 부분을 읽고 '이 논문은 어떤것이야기를 하겠구나' 라는 것을 파악하는게 중요한것 같습니다.
논문에서는 일단 network depth 와 accuracy 간의 관계가 있느냐를 말하고 싶은것 같네요. 즉, '컨볼루션을 깊게 쌓으면 성능이 좋아질까?' 라는 물음에 대답이 되는 논문이네요! 그리고 16부터 19층까지 쌓았으며, ILSVRC 2014 에서 좋은 SOTA를 달성했다 합니다. 그리고 고맙게도 네트워크를 공개하여 다른 연구에 도움을 주도록 하였습니다. 이 논문이 발표된 이후 아주 많은 다양한 분야에서 VGG 네트워크가 사용이 되었습니다.
Dataset
자 classification 데이터셋은 무엇을 사용할까요? MNIST, CIFAR, SVHN 의 간단한 데이터셋과, large scale 의 Imagenet data 를 이용합니다. 이미지넷의 대한 내용은 다음을 참고 바랍니다. [link]
또한 눈여겨봐야 할 것이 data augmentation 입니다. 같은 dataset 이라 할지라도, 어떻게 augmentation 을 하느냐에 따라서 성능이 달라지기 때문에 여기서는 무엇을 사용했는지 알아보겠습니다.
윗 문단에서 이미지를 다시 크기를 rescaling 한 후에 randomly 하게 224 x 224 size 로 crop 을 진행 한 이후에, random horizontal filpping 과 random RGB shift 를 alexnet 에서 한것과 같이 진행을 합니다.
위에 보이는 PCANoisePIL() 은 alexnet 에서 사용한 random RGB colour shift 입니다. 그리고 test 일 때 적용하는 augmentation 은 다음과 같습니다.
Flip, Crop, RGB shift 등이 사용되었습니다.
Model
VGG의 model 은 convolution 을 잘 쌓아서 만들었습니다. 다음 표를 보시겠습니다.
모두 3x3 convolution 으로 간단하게 이루어져 있으면서,11~19 까지의 모델을 사용하였습니다. 마지막에는 FC layer 를 사용하여 classification head 로 가도록 하였습니다.
Loss
다른 image classification 과 같이 Cross Entropy 입니다.
https://stackoverflow.com/questions/41990250/what-is-cross-entropy
pytorch 에서는 다음과 같이 간단하게 구현 가능합니다.
import torch.nn as nn
loss = nn.CrossEntropyLoss()
Train
다음은 training 환경입니다.
- init learning rate: 0.01
- batch size: 256
- momentum: 0.9
- weight decay: 0.0005
- epoch: 74(370k)
- learning rate decay: validation accuracy 가 증가하지 않을 때, 10 으로 나눠준다. (3번 - plateau)
- init: gaussian (0, 0.01)
- drop out : 0.5
Test
Test 도 top-1, top-5 error 로 평가를 진행했습니다.
다음 포스팅을 참고하시면 좋을것 같습니다.
https://csm-kr.tistory.com/6?category=1188059
결과를 보면, 다음 표와 같습니다.
256 x 256 image기준, top-1 accuracy 는 다음과 같습니다.
A (vgg11) : 70.4, B (vgg13) : 71.3, C (vgg16) : 71.9, D (vgg16) : 73.0. E (vgg19) : 72.7
torchvision 기준으로는 아래와 같은 성능을 보였습니다. 당시의 sota를 달성하였습니다.
https://pytorch.org/vision/stable/models.html#classification
물론 pytorch torchvision 을 이용하면 다음과 같이 간단하게 VGG를 사용할 수 있습니다.
from torchvision.models import vgg16
model = vgg16()
vgg 는 이후에 많은 task의 backbone 으로 오랫동안 사용되고 있습니다. 깊은 모델을 쌓아서 좋은 성능을 유지한 vgg 에 대한 포스팅이었습니다. 감사합니다 질문과 토론은 항상 환영합니다. 👍😎🤩
'Network' 카테고리의 다른 글
[DNN] VIT(vision transformer) 리뷰 및 코드구현(CIFAR10) (ICLR2021) (1) | 2022.09.11 |
---|---|
[DNN] Resnet 리뷰/구조 (CVPR2016) (2) | 2022.08.29 |
[DNN] ViT 구조 (0) | 2022.06.08 |
[DNN] Alexnet 리뷰 및 구현 (NIPS 2012) (0) | 2021.09.24 |
[DNN] U-net 구조와 code 구현 (MICCAI2015) (4) | 2021.05.02 |
댓글