본문 바로가기

대학원 준비2

CNN 아키텍처 정리2 - VGG

2.1 VGG 전체구조

 

 

-  다음은 VGG의 전체 구조도입니다. vgg는 오류율 7.3%16 또는 19계층 구조로, 14년도에 ILSVRC 대회에서 2위를 차지한 아키텍쳐 입니다.(여기에서는 VGG16을 기준으로 하겠습니다)

 

-  아래의 그림은 layer의 구조를 나타낸 그림입니다. 이 그림을 보면 VGGAlexNet과 전체 구조는 비슷합니다. 그저 필터 크기를 (3 x 3)으로 고정하고 (3 x 3)필터를 여러번 쓴뒤 pooling 계층을 통과시켰을 뿐입니다. 그러나 필터의 크기를 낮추고 더 깊게했을 뿐인데 VGGAlexNet에 비해 성능이 좋아졌습니다.(그 이유는 다음절을 보겠습니다)

 

 

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

 

출처 : http://cs231n.stanford.edu/syllabus.html

-  VGG의 메모리 사용량과 학습할 parameter를 정리한 그림입니다. 이걸 보면 VGG앞쪽 계층일수록 메모리 사용량은 높으나, 학습할 parameter는 적고, 뒤쪽 계층일수록 메모리 사용량은 적어지나 학습할 parameterFC 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 클래스를 사용하여 학습을 진행하고 시험을 해보는 파일입니다

가져올 라이브러리들은 다음과 같습니다. 이 때 앞에서 만든 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%

됩니다