사실 VGGNet은 14년에 발표되었으나 GoogLeNet이후 발전된 형태에 대한 내용이 모두 담긴 15년 논문을 기반으로 작성.
😶 초록 (Abstract)
- "Large-Scale image 인식에서의 정확도에 대한 ConvNet(Convolutional Network)의 깊이의 효과에 대해 조사한 결과에 대한 내용" - 매우 작은 conv filter(3x3)를 사용하여 깊이를 늘린 architecture은 선행구성(prior-art configurations), 즉 VGG도입 이전의 network architecture를 매우 향상된 성능을 16~19의 깊이를 pushing함을 통해 이룩할 수 있다.
- 이를 통한 결과로 ILSVRC에서 Localisation와 Classification 각각의(respectively) 분야에서 1, 2위를 확보하였다.
1. 서론 (Introduction)
- ConvNet이 vision분야에서 유용해지게 되면서 여러 시도들(attempts)이 기존의 "Krizhevsky의 architecture(2012)" 즉, AlexNet를 향상되게 하였다. 예를 들어, ILSVRC-2013의 제출물(Zeiler.&.Fergus, 2013; Sermanet et al., 2014)은 첫번째 Conv layer에 작은 window크기 및 stride를 사용하였다.
- 이 논문에서는 ConvNet architecture의 다른 중요한 측면을 다룬다(address). - 특히 깊이에 대해(its depths)
- 이를 위해(To this end), architecture의 다른 parameters를 고정시키고(fix) Conv. layer를 추가하며 깊이를 점진적으로 늘리는데, 이때 모든 layer에서 Conv filter가 3x3의 작은 크기이기 때문에 가능(feasibly)하다! 이때, parameter를 fix한다는 점을 주의해서 읽어야 한다. parameter를 고정시키고 layer 수를 변경한다는 의미로 이를 통해 filter수나 pooling layer의 크기와 같은 것들은 변경하지 않는다는 것을 유추할 수 있다는 점을 유의하자! 즉, 3x3 크기의 매우 작은(very small) conv filter를 사용하면 매개변수의 수를 너무 많이 늘리지 않고도 네트워크의 깊이를 늘릴 수 있다는 것이 핵심이다!
- 결과적으로 ILSVRC에서 classification과 localisation task에서 예술의 경지의 정확도(state-of-the-art) 뿐만 아니라 다른 dataset에도 적용가능할 정도였는데, fine-tuning(미세조정)없이 linear SVM을 이용한 분류와 같은 간단한 pipline까지 적용가능하다.
- 이후에 소개할 Section은 다음과 같다. • Section 2. 우리들의 ConvNet의 구성(configurations)에 대한 서술 • Section 3. image classification training과 evaluation에 대한 세부사항 • Section 4. ILSVRC의 classification 작업에 대한 구성 • Section 5. 이 논문의 결론 • Completeness. - Appendix A. ILSVRC-2014 object localisation system에 대한 설명 및 평가 - Appendix B. 다른 datasets의 very deep feature의 generalisation에 대한 논의 - Appendix C. 개정된(revision) major paper의 list
2.ConvNet Configurations
2.1 Architecture
- training에서 ConvNet의 input은 224x224 크기의 RGB image로 setting되었다. - preprocessing에는 딱 하나의 방법을 사용했는데, 바로 subtracting mean RGB value이다. 평균 RGB값을 빼는 것은 network 통과 전, input image에 적용되는 전처리 단계인데, training set의 평균 RGB값을 계산하고 input image의 각 pixel에서 빼는데, 이를 통해 data를 중앙(center)에 놓고 input image의 잠재적 편향(potential bias)을 제거하기 위함이다. mean-RGB 값은 training set의 평균 색상(average color)을 나타내며 이를 빼면 데이터가 더 "zero-centered"되어 네트워크 훈련에 도움이 되고 더 나은 성능으로 이어질 수 있다.
- 그 후 Conv.layer stack을 통과하는데, 이때상하좌우, 중앙의 개념을 포착가능한 최소크기인 3x3의 filter를 이용한다. 이때, stride는 1 pixel로 고정된다. - configurations의 또 다른 하나는 1x1의 Conv filter를 사용한 것이다. 이는 input channel의 linear transformation(선형 변환; 비선형성)으로 볼 수 있다.
- Conv. layer input의 spatial padding은 convolution 후 공간해상도(spatial resolution)가 유지되는 것으로 padding은 3x3 Conv.layer에 대해 1pixel인 것이다. - Spatial pooling은 5개의 Max-pooling을 갖는데, 이는 Conv.layer의 일부를 갖는다. 즉, 모든 Conv.layer가 Max-pooling을 갖는 것은 아니며 Max-Pooling은 2x2의 pixel window, strides=2이다.
- Conv.layer이후 3개의 FC(Fully-Connected layer)가 뒤따른다. 1, 2번째 layer는 4096의 channels를 가지며 3번째 layer는 1000개의 ILSVRC classification을 위한 1000개의 channels를 가지며 soft-max layer이다.
- 모든 은닉층들(hidden-layers)은 rectification non-linearity(Krizhevsky et al., 2012 (=AlexNet)), 일명 ReLU를 갖춘 형태이다.
- Section 4.에서 알 수 있듯, 이 논문에서는 하나를 제외하고 network중 어느것도 LRN(Local Response Normalization)을 포함하지 않는다. 이런 정규화는 ILSRVC dataset의 성능을 향상시키지 않고 메모리소비 및 계산시간을 늘리기 때문이다.
2.2 Configurations
-표 1에 하나의 열당 하나씩(one per column)본 논문에서 평가한 ConvNet configurations가 요약되어 있다. 표에서는 A부터 E까지 각각의 nets의 이름을 언급하며 일반적인 design은section 2.1에서 말한것과 동일하며 단지 depth만 다르다(11-weight layers ~ 19-weight layers). width는 다소 작은 64의 first-layer로 시작하며 각 Max-Pooling-layer를 거친 후에 512에 도달하기 전까지 2의 배수(factor of 2)만큼씩 증가한다.
-표 2는 각 configuration의 parameters의 수에 관한 것으로 large depth에도 불구하고(In spite of) 우리의 net의 weight 수는 더 큰 Conv.layer width와 receptive field를 가진 더 얕은(shallow) net의 weight수보다 크지 않다.(Serman et al., 2014)
2.3 Discussion
-우리의 ConvNet은 지금까지 사용된 ILSVRC-2012(Krizhevsky et al., 2012)와 ILSVRC-2013(Zeiler & Fergus, 2013; Sermanet et al., 2014)와는 꽤 다른데, 상대적으로 큰 크기의 receptive field(11x11 with stride 4 in Krizhevsky et al., 2012. ||. 7x7 with stride 2 in Zeiler & Fergus, 2013; Sermanet et al., 2014)를 사용하기보다는 오히려 3x3의 작은 크기의 receptive field with stride 1을 전체의 net에 사용하였다. 표 1, 표 2
-2개의 3x3 conv.layer의 stack이 효과적인 5x5의 receptive field를 갖는 것을 쉽게 볼 수 있는데, 이런 3개의 layers는 7x7의 effective receptive field를 갖는다.
그렇다면, 단일 7x7 layer대신3x3 Conv.layer의 stack의 사용을 통해 무엇을 얻었는가? ① single layer대신 3개의 ReLU layer를 통합(incorporate)하여 결정함수(decision function)을 차별화(discriminative)한다. Decision function은 input features를 가져와 예측된 출력이나 결정을 생성하는 함수로 보통 supervised learning에서 사용되며 train data에서 학습된 mapping을 기반으로 새로운 input에 대한 예측을 만드는데 사용된다.
② parameter의 수를 줄인다. - 3개의 3x3 conv stack layer가 C개의 channel이 있다고 가정 - stack은 3(3^2 C^2) = 27C^2개의 weights에 의해 매개변수화(parametrised)된다. - 동시에 single 7x7 conv. layer는 7^2 C^2 = 49C^2개의 매개변수를 갖는다. - 즉, 81%나 더 많은 weight를 가지는 것을 알 수 있다. ∴ 이는 7x7 conv.filters에 정규화(regularization)를 부과하는 것으로 볼 수 있으며 3x3 filter를 통해 강제로 분해(forcing, decomposition)된다. (그 사이에 비선형성이 주입된다; non-linearity is injected)
- 표 1에서의 Configuration C(VGG-16)의 1x1 conv.layer의 통합(incorporation)은 conv.layer의 receptive field에 영향을 미치지 않고 ReLU함수에 의해 추가적인 비선형성이 도입되기에 decision function의 비선형성(non-linearity)를 증가시키는 방법이다.
- depth를 늘림으로 더 나은 결과를 얻는 것을 알 수 있었는데, 우리의 연구와는 독립적으로 연구된 GoogLeNet 또한 매우 깊은 ConvNet(22-weight layers)와 작은 conv.filters(3x3, 1x1, 5x5)에 기반을 뒀다는 점에서 비슷하다는 것을 알 수 있다.
3.Classification Framework
이전 section에서 network configurations의 detail을 알아봤다면, 이번 section에서는 classification ConvNet training .&. evaluation의 detail에 대해 알아볼 것이다.
3.1 Training
- ConvNet training 과정은 전반적으로 AlexNet을 따라간다. (이후 설명하는 multi-scale traininig image에서 input값을 sampling하는 것은 제외된다.) 즉, training은 momentum을 가진 역전파 기반의 mini-batch GD(Gradient Descent)를 사용해 multinomial logistic regression 목표를 최적화함으로써 수행된다.(LeCun et al., 1989) 이때, batch size는 256, momentum은 0.9이다.
- training은 다음과 같은 사항들로 규제화(regularized)되었다. L2 규제화(5*10^-4) 1, 2 FC.layer에 Dropout(0.5)
- learning-rate는 다음과 같이 조정되었다. 처음 초기화 당시에는 10^-2로 조정되었으나 validation set accuracy가 향상이 되지 않을 때마다 10의 배수만큼 감소하도록 하였다. 그렇게 총 3번의 학습률 감소가 발생하였으며 370K의 iterations(74 epochs) 이후 완전히 멈추었다. 1, 2 FC.layer에 Dropout(0.5)
- AlexNet과 비교해 매우 많은 parameter와 깊은 depth에도 불구하고 우리는 nets가 (a) 더 깊은 depth와 더 작은 conv.filter size에 의해 부과되는(impose) 암시적 정규화(implicit regularization)와 (b) 특정 layer의 사전 초기화(pre-initialization)로 인해 수렴(coverage)하는데 더 작은 epoch이 필요했다고추측(conjecture)하였다.
- network의 weight는 depp nets의 gradient instability로 인해 학습을 지연(stall)시킬 수 있어서 중요하다. - 이 문제를 피하기 위해 random initialization으로 훈련할 수 있을 정도로 얕은 VGG-11(표 1-A) training부터 시작하였다. - 그 후 더 깊은 구조로 훈련할 때, 처음 4개의 Conv.layer와 마지막 3개의 FC.layer를 net A의 layer로 초기화 하였다. (중간 layers는 무작위로 초기화) - 사전 초기화된 layer에 대한 학습률을 줄이지 않았기에 학습중에 learning 변경가능하였다. - random initialization에 해당하는 경우, zero-mean과 variance가 10^-2인 정규분포에서 weight를 표본으로 추출하였으며 - bias는 0으로 초기화되었다.
- 고정된 크기의 224x224 ConvNet input image를 얻기 위해 resized된 train imaged에서 random하게 crop을 하였다. 이때, SGD iteration이 한번 일어날 때마다 image 하나당 한번의 crop을 진행 - 더 추가적인 training set에 대한 Data Augmentation은 random하게 horizontal flip, RGB shift를 진행하였다.(AlexNet과 동일) 아래에서 training image rescaling에 대해 설명
Training image size S를 ConvNet input이 잘리는 등방성으로 scale된(isotropically-rescaled) training image의 가장 작은 면(side)이라 하자. (이때, S를 training scale이라도 한다.) crop크기는 224x224로 고정이지만 S는 224이상의 값을 취할 수도 있으며 S=224의 경우, crop은 training image의 가장 작은 면에 걸쳐 전체 image의 statistics(통계)를 capture한다. S에 대해 >> 224의 경우 crop은 작은 물체나 물체 부분을 포함하는 image의 작은 부분(part)에 해당한다.
우리는 training scale S를 설정하기 위해 2가지의 접근법을 고려한다. ① single-scale training에 해당하는 S를 수정하는 것(sampling된 결과물내의 image 내용은 여전히 multi-scale image 통계를 나타낸다) - 이 실험에서 우리는 S=256와 S=384의 2가지 고정된 척도로 training된 model을 평가(evaluate)한다. - ConvNet configuration을 고려하면, i) 먼저 S=256을 사용해 network의 training을 진행 ii) S=384 network의 training 속도를 높이기 위해 S=256으로 pre-trained된 weight로 초기화 iii) 10^-3의 더 작은 초기 학습률의 사용
② Multi-scale training으로 각 train-image는 특정범위[S_min, S_max]에서 무작위로 S를 sampling하여 개별적으로 rescale한다. (이 실험에서는 S_min = 256 .&. S_max = 512를 사용). 객체의 image가 다른 크기를 가질 수 있기(can be of) 때문에 training을 하면서 이를 고려하는 것이 좋다. 이는 single-model이 광범위한 scale에 걸쳐 물체를 인식하도록 training하도록 스케일을 조금씩 움직이는 것(scale-jittering)에 의해 training augmentation로도 볼 수 있다. 속도상의 이유로 S=384로 고정되어 pre-trained된 동일한 구조(same-configuration)의 single-scale model의 모든 layer를 미세조정(fine-tuning)하여 multi-scale model을 훈련시켰다.
3.2 Testing
-test시 훈련된 ConvNet과 input image가 주어지면, 다음과 같이 분류된다. ① 사전 정의된 가장 작은 이미지 면을 Q라 하면, Q로 등방적 스케일링(isotropically rescaled)이 된다. 이때, Q가 반드시 training scale S와 같지는 않다는 점을 알아야 한다. section 4에서 알 수 있듯 각 S에 대해 몇가지 Q값을 사용하면 성능이 향상된다.
② network는 (Serman et al., 2014)와 유사한 방식으로 rescaled된 test image 위에 촘촘히(densely) 적용된다. 즉, FC.layer은 먼저 Conv.layer(첫 번째 FC는 7 × 7 Conv, 마지막 두 FC layer는 1 × 1 Conv)로 변환된다.
③ 결과적으로 fully-convolutional network가 전체 image(uncropped)에 적용된다. 그 결과, channel 수가 class수와 동일한 class 점수 map, input size에 따라 가변 공간 해상도(variable spatial resolution)이 생성된다.
④ 최종적으로 image에 대한 class점수의 고정크기벡터(fixed-size vector)를 얻기 위해 class 점수 map은 공간적으로 평균화(spatially averaged)된다. (sum-pooled) 또한, horizontal flip을 통해 test set을 증가시키는데, 원본과 flip된 image에 뒤이어 나오는 softmax-class는 image에 대한 최종값을 얻기 위해 averaged된다.
-Fully-Convolutional network가 전체 image에 적용되기에 test에서 여러 결과를 sampling할 필요가 없으며 각 결과에 대한 network의 재계산이 필요하기에 효율성이 떨어지게 된다.동시에 Szegedy 등(2014)이 수행한 것처럼 대규모 결과셋을 사용하면 Fully-Convolutional network에 비해 input image를 더 미세하게 샘플링할 수 있기 때문에 정확도가 향상될 수 있다. - 또한 multi-crop evaluation은 convolution boundary가 다르기에 dense evaluation을 보완한다. ConvNet을 crop에 적용할 때, Convolution feature map은 zero-padding된다. 하지만 dense evaluation의 경우, 동일한 crop에 대한 padding은 image의 인접부분(neighbouring part)에서 자연스레 발생하며 이는 전체 network receptive field를 상당히 증가시키기에 더 많은 context가 captured된다. - 실제로 여러 결과의 계산시간증가가 잠재적 정확도 향상을 정당화하지는 않는다고 믿는다. 다만 우리는 scale당 50개의 crops(5x5의 regular grid와 2 flips)을 사용해 network를 평가하는데, 이는 Szegedy(2014)등이 사용한 4개 이상의 scale의 144개의 결과물과 비교할 수 있다.
3.3 Implementation Details
- 우리의 구현은 공개적 소스인 C++ Caffe toolbox(Jia, 2013)에서 파생되었으나 많은 중요한 수정사항을 포함하기에 single system에 설치된 여러 GPU에서 train 및 평가를 수행할 수 있을 뿐만 아니라 여러 규모의 crop되지 않은 전체 크기 image에 대한 train과 평가를 수행할 수 있다. (위에서 설명했듯.) -Multi-GPU training은 data parallelism(데이터 병렬화)를 활용하며 train image의 각 batch로 분할하여 각 GPU에 병렬로 처리함으로 수행된다. - GPU batch gradient가 계산된 이후 전체 batch의 gradient를 얻기 위해 평균화(averaged)된다. - Gradient computation은 GPU에서 동기화(synchronous)되기에 결과는 single GPU에서 훈련될 때와 "정확하게 동일"하다.
- network의 다른 layer의 model과 데이터 병렬화를 사용하는 ConvNet의 훈련속도를 높이는 정교한 방법이 2014년, Krizhevsky에 의해 제안되었다. - 하지만 우리는 개념적으로 훨씬 간단한 scheme(방식)이 single GPU를 사용하는 것에 비해 기성품인(off-the-shelf) 4-GPU system에서 이미 3.75배의 속도를 제공하는 것을 알았다.
-4개의 NVIDIA Titan Black GPU가 장착된 시스템에서 single net을 training하는 데는 architecture에 따라 2-3주가 소요되었다.
🤔여기서 잠깐!Scale-Jittering이란?
Jittering: 조금씩 움직임 • image classification을 위한 CNN의 성능을 개선하는데 도움이 되도록 VGGNet 논문에서 도입된 data augmentation 기술 - scale jittering의 기본 아이디어는 훈련 중 input image scale을 무작위로 재조정하여 네트워크가 다른 스케일에서 객체를 인식하는 방법을 학습하도록 하는 것.
- 이는 특정 범위(예: 256~512 픽셀) 내에서 input image size를 rescaled한 다음 무작위로 다시 원래 크기로 잘라서 얻게 되는데, 예를 들어 훈련 중에 지정된 입력 이미지의 크기를 320 x 320 픽셀, 384 x 384 픽셀 또는 448 x 448 픽셀로 임의로 조정한 다음 원래 크기인 224 x 224 픽셀로 임의로 자를 수 있다.
- 이 기술을 적용함으로써 신경망은 다양한 크기와 방향에서 물체를 인식하는 법을 배우게 되어 다양한 이미지에서 성능을 향상시키는 데 도움이 될 수 있다.
- scale jittering은 특히 광범위한 스케일과 종횡비가 있는 이미지를 처리할 때 CNN의 견고성(robustness)과 일반화 능력을 향상시키는 간단하고 효과적인 방법이다.
- 이것은 많은 computer vision에서 data augmentation의 표준이 되었으며 random crop, vertical flipping 및 color jittering과 같은 다른 기술과 함께 자주 사용된다.
4.Classification Experiments
Dataset 이번 section에서는 ILSVRC 2012-2014 과제에 사용된 ILSVRC-2012 dataset에서 설명된 ConvNet architecture에 의해 달성된 image classification 결과를 제시한다. data set은 1000개의 image class의 image로 train(130만개), validation(5만개), test(10만개)로 3개의 set으로 나눈다.
분류성능(classification performace)은 top-1 오류와 top-5 오류의 두 가지 측정을 사용하여 평가한다. top-1 error: mutli-class classification error (잘못 분류된 image의 비율) top-5 error: ILSVRC에 사용되는 주요 평가 기준 (ground-truth category가 top-5 predicted category를 벗어나는지)
대부분의 실험(majority of experiments)에서 validation set를 test set으로 사용하였으며 test sest에도 특정 실험을 수행하여 ILSCRC-2014대회의 "VGG"팀 entry로 공식 ILSVRC 서버에 제출하였다.(Russakovsky et al., 2014)
4.1 Single Scale Evaluation
- Sect. 2.2에서 설명한 것처럼 layer configuration에single scale을 적용된 각각의 ConvNet model에 대해 성능(performance)를 측정(evaluate)했으며 test size는 다음과 같이 적용하였다. test image size는 고정된 S의 경우, Q = S이고 jitteringS∈[S_min, S_max]의 경우 Q = 0.5(S_min + S_max)로 설정하였다. 이것의 결과는 표 3에 나와있다. (The results of are shown in Table 3)
① 먼저, 어떠한 정규화 layers도 없는 경우, local response normalization (A-LRN network)는 model A에 아무런 증진을 하지 못한다는 것을 알았다. ∴ 따라서 더 깊은 구조들인 B-E는 normalization을 사용하지 않았다!
② 둘째, ConvNet의 깊이를 증가시킬수록 classification error가 감소하는 것을 관찰할 수 있었다: VGG-11에서 19까지(A-E) 주목할 점은 동일한 깊이에도 불구하고 configuration C(1x1 conv.layers가 3개)가 configuration D(3x3 conv.layers)보다 훨씬 나쁜 성능을 보여주었다는 점인데, 이는 아래를 시사한다는 점을 알 수 있다. 추가적인 non-linearity는 도움이 되는데(C > B), 더 중요한 점은사소하지 않은 receptive field(neural net의 복잡성과 표현력을 늘린다)와 함께 conv.filters를 사용하는 것으로공간적인 내용을포착한다는 것이다. 우리의 architecture의 error rate는 깊이가 19층이 되었을 때 포화되었지만, 더 깊은 model은 더 큰 datasets에 효과적일 지도 모르겠다. 또한, net B에서 파생된 network(3x3conv.layer를 shallow filter인 5x5 conv.layer로 각각 모두 바꾼 network)와 B를 비교해 보았다. top-1 error rate는(center crop에서) B의 오차보다 7% 더 높게 측정되었다. 이를 토대로 작은 filter가 있는 net이 더 큰 filter가 있는 shallow net보다 성능이 우수함을 확인할 수 있었다.
③ 마지막으로, training때의 scale jittering(S∈[256; 512])을 하는 것은single scale이 test time에 사용됨에도 불구하고고정된 최소 측면(fixed smallest side)인 S = 256 or S = 384의 image로 training하는 것 보다 더욱더 좋은 결과를 도출한다. 이는 scale jittering에 의한 training set augmentation이 multi-scale image의 통계를 포착하는데 실제로 도움이 된다는 것을 보여준다.
4.2 Multi-Scale Evaluation
- single scale의 ConvNet model을 측정할 때, 이제 우리는 test시의 scale jittering의 효과를 평가할 수 있다. 이는 Q의 다른값에 해당하는 test image의 여러 rescaled된 버전에서 모델을 실행한 후 결과class의 뒷부분을 평균화(averaging)하는 것으로 구성된다. - training과 testing scale의 큰 차이(discrepancy)가 성능을 떨어뜨리는 것을 초래한다는 점을 고려하면, 고정된 S로 훈련된 model은 train image에 가까운 3개의 test image size에 걸쳐 평가되었다: Q = {S − 32, S, S + 32}. 동시에, training시 scale jittering을 하는 것은 network가 test시 더 넓은 범위의 scales를 적용할 수 있다는 것을 허용하는데, 따라서 변수 S ∈ [Smin; Smax]로 훈련된 model은Q = {Smin, 0.5(Smin + Smax), Smax}의 더 넓은 범위에서측정된다. - 그 결과로 표 4에서 알 수 있듯, test시의 scale jittering은(표 3에서 single scale을 적용한 동일한 model의 결과와 비교해 보았을 때)좋은 성능을 내는 것을 알 수 있다. 전과 같이 가장 깊은 configuration인 D와 E가 가장 성능이 최상이었으며 scale jittering은 고정된 최소면(smallest side)인 S보다 더욱 잘 training되는 것을 알 수 있다. - validation set에서 top-1/top-5 error의 최고의 single-network성능은(표 4에서 강조처리된)24.8%, 7.5%이다. test set에서 configuration E는 7.3%의 top-5 error를 달성하였다.
4.3 Multi-Crop Evaluation
- 표 5에서는 ConvNet dense의 결과와 multi-crop의 결과를 비교할 것이다.(Sect. 3.2에 세부사항을 볼 수 있다.) - 또한 두 결과(evaluation)의 technique의 보완성을 softmax한 결과의 평균을 통해 평가(assess)할 것이다. - 보이다싶이 multiple crops가 dense보다 쪼오오금 더 나으며 두 접근들은 실제로 보완이 필요했는데, 둘의 조합이 그 둘 각각을 능가하기 때문이었다. 위에서 적었듯, 이는 convolution boundary 조건의 다른 처리(treatment) 때문이라고 가설을 세웠다.
4.4 ConvNet Fusion
- 지금까지 우리는 각각의 ConvNet model들의 성능을 측정(evaluate)했다. 이런 일련의 실험에서 우리는 몇몇의 model들의 결과에 대해 softmax class의 후위를 평균화하면서(averaging) 결합했는데, 이는 models의 보완성에 기인하는 성능을 향상시킨다.
- 결과는 표 6에서 볼 수 있다. ILSVRC 제출때까지 우린단지multi-scale model인 D(모든 층을 하기보단 FC에만 fine-tuning을 진행한 model)뿐만 아니라 single-scale network만 train하였는데, 7개의 network의 앙상블에대한 결과로 7.3%의 ILSVRC test error를 얻었다. 제출 이후, 우린 단지 multi-scale model에서 최고성능을 기록한2개의 configuration인 D와 E를 앙상블(emsemble)하였는데, 이는 test error를 7.0%(using dense evaluation)와 6.8%(using combined dense .&. multi-crop evaluation)까지 줄여주었다. - 우리가 도출한 최고의 성능은 7.1% error이다. (표 5, model E)
4.5 Comparison with the State of the Art
- 최종적으로, 우리의 결과를 표 7에서 최첨단 결과와 비교한다. ILSVRC-2014 challenge의 classification과제에서 우리 "VGG"팀은 7개의 model로 구성된 앙상블(emsemble)을 이용해 7.3%의 test error로 2위를 차지했으며 제출 이후 두 model의 앙상블을 사용해 error를 6.8%까지 낮췄다.
- 표 7에서 알 수 있듯, 우리의 "very deep ConvNets"은 이전 세대의 model과 비교해서 현저하게 뛰어남(significantly outperform)을 알 수 있다. 우리의 결과는 또한 classification 과제에 관하여 우승자인 GoogLeNet(6.7% error)에 견줄만하며 ILSVRC-2013의 우승제출물인 Clarifai(외부training data로 11.2% 달성)보다 상당히 크게 능가하였다.
- 이 점은 우리의 최상의 결과가 단지 2개의 model을 결합하여 이룩한 점(다른 제출물에 비해 매우 낮은 점)을 고려하면 괄목할만 하다. - single-net 성능의 측면에서(in terms of), 우리가 이룩한 구조의 최상의 결과는 7.0%test error로 0.9%의 차이로 single GoogLeNet을 압도하는데, 이는 괄목할만한게 1989년의 전통적인 ConvNet 구조와 크게 다르지 않지만 상당히 깊이를 증가시켰기 때문이다.
5.Conclusion
- 이 작업에서 우린 very deep ConvNet(19 weight layer까지)를 large-scale image classification에 대해 평가했다(evaluated). - 이는 classification accuracy에 유익한(beneficial) depth를 통해 증명할 수 있으며 conventional ConvNet 구조를 사용함으로 성취(achived)할 수 있다.
- Appendix에서는 model이 다른 광범위한 dataset에서 잘 일반화가 된 것에 대한 글을 적었으며 우리의 결과는 또다시(yet again) depth의 중요성을 확인할 수 있었다.
Acknowledgements (논문 사사) - This work was supported by ERC grant VisRec no. 228180. We gratefully acknowledge the support of NVIDIA Corporation with the donation of the GPUs used for this research.
😶 부록 (Appendix)
A.Localisation
A.1 Localisation ConvNet
• Training - • Testing -
A.2 Localisation Experiments
• Settings comparison - • Localisation eror for different modifications -
B. Generalisation of Very Deep Features
• - -
C. Paper Revisions
• - -
🧐 논문 감상_중요개념 핵심 요약
"Very Deep Convolutional Networks for Large-Scale Image Recognition" Karen Simonyan과 Andrew Zisserman이 2015년에 발표한 연구 논문으로이 논문은 2014년 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)에서 최첨단 성능을 달성한 VGGNet이라는 심층 합성곱 신경망 아키텍처를 제안한다.
[핵심 개념]
1. Deep Convolutional Neural Networks 이 논문은 Convolution 및 Pooling 층의 여러 layer로 구성된 Deep CNN Architecture를 제안했으며 그 뒤에 여러 개의 Fully-Connected layer가 있다.
2. Small filter size 이 논문은 이전 layer에서 더 큰 filter의 사용 대신전체 신경망에 걸쳐 3x3 conv.filter를 사용할 것을 제안했는데, 이것은 더 적은 매개변수와 더 효율적인 모델로 이어진다.
3. Stacking Layers 이 논문은 더 깊은 신경망의 형성을 위해전체의 신경망에 걸쳐 3x3 filter가 있는 여러 개의 conv.layer를 쌓을 것을 제안했습니다. 이렇게 하면parameter 수를 너무 많이 늘리지 않고도 성능이 향상된다.
4. Max Pooling 이 논문은 2x2 filter와 stride=2인 MaxPooling Layer를 사용해 feature map의 공간 차원(spatial dimension)을 줄이고 변환 불변성(translation invariance)을 제공했다.
5. State-of-the-Art Performance 이 논문은 ILSVRC 2014 분류 작업에서 최신 성능을 달성하여 이전 방법보다 훨씬 뛰어난 성능을 보여준다.
전반적으로 이 논문은작은 conv.filter의 사용 및 multi-layer stack같은 딥 러닝의 몇 가지 중요한 개념을 소개하고 까다로운 컴퓨터 비전 작업에서 최첨단 성능을 달성하는 데 있어 그 효과를 입증했다.
🧐 논문을 읽고 Architecture 생성 (withtensorflow)
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPool2D, Dropout, Dense, Flatten, AveragePooling2D
def vgg_block(inputs, filters, num_convs):
x = Conv2D(filters, (3,3), padding='same', activation='relu')(inputs)
for i in range(num_convs-1):
x = Conv2D(filters, (3,3), padding='same', activation='relu')(x)
x = MaxPool2D((2,2), strides=2)(x)
return x
def vgg_A(input_shape, num_classes):
inputs = tf.keras.layers.Input(shape=input_shape)
x = vgg_block(inputs, 64, 1)
x = vgg_block(x, 128, 1)
x = vgg_block(x, 256, 2)
x = vgg_block(x, 512, 2)
x = vgg_block(x, 512, 2)
x = Flatten()(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
outputs = Dense(num_classes, activation='softmax')(x)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
return model
def vgg_A_LRN(input_shape, num_classes):
inputs = tf.keras.layers.Input(shape=input_shape)
x = vgg_block(inputs, 64, 1)
x = vgg_block(x, 128, 1)
x = vgg_block(x, 256, 2)
x = vgg_block(x, 512, 2)
x = vgg_block(x, 512, 2)
x = Flatten()(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
outputs = Dense(units=num_classes, activation='softmax')(x)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
return model
def vgg_B(input_shape, num_classes):
inputs = tf.keras.layers.Input(shape=input_shape)
x = vgg_block(inputs, 64, 2)
x = vgg_block(x, 128, 2)
x = vgg_block(x, 256, 2)
x = vgg_block(x, 512, 2)
x = vgg_block(x, 512, 2)
x = Flatten()(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
outputs = Dense(units=num_classes, activation='softmax')(x)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
return model
def vgg_C(input_shape, num_classes):
inputs = tf.keras.layers.Input(shape=input_shape)
x = vgg_block(inputs, 64, 2)
x = vgg_block(x, 128, 2)
x = vgg_block(x, 256, 3)
x = vgg_block(x, 512, 3)
x = vgg_block(x, 512, 3)
x = Flatten()(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
outputs = Dense(units=num_classes, activation='softmax')(x)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
return model
def vgg_D(input_shape, num_classes):
inputs = tf.keras.layers.Input(shape=input_shape)
x = vgg_block(inputs, 64, 2)
x = vgg_block(x, 128, 2)
x = vgg_block(x, 256, 3)
x = vgg_block(x, 512, 3)
x = vgg_block(x, 512, 3)
x = Flatten()(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
outputs = Dense(units=num_classes, activation='softmax')(x)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
return model
def vgg_E(input_shape, num_classes):
inputs = tf.keras.layers.Input(shape=input_shape)
x = vgg_block(inputs, 64, 2)
x = vgg_block(x, 128, 2)
x = vgg_block(x, 256, 4)
x = vgg_block(x, 512, 4)
x = vgg_block(x, 512, 4)
x = Flatten()(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
outputs = Dense(units=num_classes, activation='softmax')(x)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
return model
# VGG-19의 예시
model = vgg_E(input_shape=(224,224,3), num_classes=1000)
model.summary()