2.1 VGG 전체구조
- 다음은 VGG의 전체 구조도입니다. vgg는 오류율 7.3%인 16 또는 19계층 구조로, 14년도에 ILSVRC 대회에서 2위를 차지한 아키텍쳐 입니다.(여기에서는 VGG16을 기준으로 하겠습니다)
- 아래의 그림은 각 layer의 구조를 나타낸 그림입니다. 이 그림을 보면 VGG는 AlexNet과 전체 구조는 비슷합니다. 그저 필터 크기를 (3 x 3)으로 고정하고 (3 x 3)필터를 여러번 쓴뒤 pooling 계층을 통과시켰을 뿐입니다. 그러나 필터의 크기를 낮추고 더 깊게했을 뿐인데 VGG는 AlexNet에 비해 성능이 좋아졌습니다.(그 이유는 다음절을 보겠습니다)
2.2 필터 크기와 신경망 성능
- (5 x 5) 영역에 (5 x 5)크기의 필터를 사용할 경우를 생각해보겠습니다. convolution의 결과로 (1 x 1)이 나오는데 이 때, 필터가 학습할 파라미터는 25개가 나옵니다.
- 그런데 (5 x 5) 영역에 (3 x 3)크기의 필터를 2번 사용할 경우, 같은 결과인 (1 x 1)을 얻을수 있습니다. 이 때, 필터가 학습할 파라미터는 18개가 나옵니다
- 즉, (5 x 5) 필터대신 (3 x 3) 필터 2개를 써도 같은 수용영역을 얻을 수 있으므로, 학습할 parameter는 적게 하면서 Layer를 깊게 할 수 있다. Layer가 깊어지면 신경망의 비선형성을 높일 수 있다.
2.3 각 Layer에서의 출력
2.4 학습할 Parameter 수
- Conv1_1은 (3x3)필터가 64개 있습니다. 그러므로 입력데이터의 채널까지 고려시 1728개가 나옵니다. Conv1_2는 (3x3)필터가 64개 있는건 같으나, 입력데이터의 채널을 고려시 36864개가 나옵니다
- 이처럼 입력 ~ 출력까지 모든 parameter를 구하면 138M개가 나옵니다. 즉 VGG는 학습할 parameter가 많습니다
2.5 메모리 사용량
- Input Image = (224 x 224 x 3) 일 때 사용되는 노드는 총 150K개입니다.
- Conv1_1에서 사용되는 노드의 개수는 3.2M개, Conv2_1에서 사용되는 노드의 개수는 1.6M개입니다
- 입력 ~ 출력까지 모든 노드을 구하면 24M개가 나오고, 1노드당 4Byte 메모리를 사용하므로.Total Memory는
96MB를 사용하게 됩니다
2.6 메모리 & parameter
- VGG의 메모리 사용량과 학습할 parameter를 정리한 그림입니다. 이걸 보면 VGG는 앞쪽 계층일수록 메모리 사용량은 높으나, 학습할 parameter는 적고, 뒤쪽 계층일수록 메모리 사용량은 적어지나 학습할 parameter는 FC layer 때문에 폭증하는걸 알 수 있습니다.
2.7 VGG 세부사항
2.8 VGG 구현 - 가정
이제 VGG를 구현해보겠습니다. 먼저 VGG를 만들 때 가정한 점은 다음과 같습니다
첫 번째로, ImageNet 대신 Fashion-MNIST 데이터셋을 사용했습니다. 이 때, 이미지 크기가 28 x 28로 작으니, VGG 모델 그대로 할 수 없습니다, 그러므로 layer들을 위 그림과 같이 조금 줄여줬습니다.
두 번째로, 각 Conv Layer 뒤에 Batch Normalization을 써줬습니다
세 번째로, 가중치 최적화는 Adam을 사용하였습니다.
네 번째로, Overfitting을 방지하기 위해 Data Augmentation을 사용하였습니다.
2.9 VGG 구현 - VGG_Class 파일
이 클래스는 _layers라는 리스트변수에 VGG에서의 각 layer에 대해 정의해줍니다. 이때 앞에서 얘기했듯이, 원래 VGG구조에 비해 layer들의 수가 줄었습니다. 또한 VGG가 호출될 때 아래의 call 메서드를 보면, 그냥 말 그대로 _layers 리스트변수에 저장된 원소들을 차례로 실행합니다
2.10 VGG 구현 - VGG_eval 파일
다음은 위에서 만든 VGG_Class 파일의 VGG 클래스를 사용하여 학습을 진행하고 시험을 해보는 파일입니다
하이퍼파라미터를 다음과 같이 정의하였고, dataset_test, dataset_train 변수에 Fashion-MNIST 데이터셋을 저장해줍니다 그 후, 이 데이터셋에 대해 정규화 + 셔플 + 배치를 해줍니다. 또한 Data augmetation을 위해 datagen 이라는 변수를 선언해줍니다. 그 후, VGG객체를 생성해주고 이 모델에 대해 요약한 정보를 출력하게 합니다
입력값에 대해 원핫라벨한 뒤, 교차엔트로피를 통과시키는 loss_object 변수를 선언하고, optimizer에는 Adam을 저장합니다. 그리고 훈련시와 시험시의 loss와 accuracy를 저장할 변수를 선언해줍니다.
train_step은 모델의 결과값과 레이블을 체크하고 역전파를 구하고, 훈련 데이터에 대한 loss와 accuracy를 구하는 함수이고
test_step은 시험 데이터에 대한 loss와 accuracy를 구하는 함수 입니다
이제 훈련과 시험을 해줍니다. 우선 100에폭에 대해 반복문을 실행하는데, 먼저 훈련데이터에 대해 실행합니다. 이때 data augmetation된 훈련데이터셋을 만들어 주고, 훈련을 해줍니다, 그 후 시험데이터셋에도 같은 과정을 해줍니다.
그 결과값인 loss와 accurtacy를 리스트변수인 train_accuracies와 test_accuracties에 추가해주고 각 파라미터들에 대해 출력을 합니다
2.11 VGG 구현 - 실행 결과
신경망을 100에폭 동안 훈련과 시험을했을 때 loss와 accuaracy가 나오게 됩니다. 이 때 VGG 모델의 성능은 92.68%가
됩니다
'대학원 준비2' 카테고리의 다른 글
CNN 아키텍처 정리5 - 그 외 아키텍처(MobileNet, U-Net, DenseNet, ResNext) (0) | 2020.09.09 |
---|---|
CNN 아키텍처 정리4 - ResNet (0) | 2020.09.09 |
CNN 아키텍처 정리3 - GoogLeNet (0) | 2020.09.09 |
CNN 아키텍처 정리1 - AlexNet (0) | 2020.09.09 |