본문 바로가기

대학원 준비2

CNN 아키텍처 정리1 - AlexNet

1.1 ImageNet

-  ImageNet 이란, 1000가지의 객체의 카테고리를 가지는 데이터셋입니다. ImageNet을 사용한 객체 인식 대회인 ILSVRC가 매년 열리는데, 2012년에 AlexNet이라는 아키텍처가 나와서 객체 인식 error rate25%에서 16%로 크게줄였습니다.

 

AlexNet98년에 나온 LeNet의 구조와 거의 똑같지만, 그 당시의 접근법과 다르게 신경망 모델을 깊게 했고, CNN의  구조를 베이스로 하여서 12년도 ILSVRC를 우승했습니다. AlexNet 등장 이후, 그 이후에 등장하는 신경망 모델들은   AlexNet처럼 깊은 신경망 구조를 사용하기 시작했습니다.

 

 

1.2 AlexNet 전체구조

 

 

AlexNet의 각 layer의 구조를 보면, 전체적으로는 5개의 Conv계층과 3개의 FC계층이 있습니다. 그리고 각 layer

   구조는 다음과 같습니다.

   Conv1(11 x 11)크기의 필터 96개이고 pad = 0, stride = 4

   pool1(3 x 3)크기의 필터인데 stride = 2

   Conv2(5 x 5)크기의 필터 256개를 썼고, pad = 2, stride = 2

   pool2(3 x 3)크기의 필터인데 stride = 2

 

-  8 layer 구조인 이유는, 가중치를 가지는 층인 FC와 Conv 계층의 수를 세보면 8개이기 때문입니다

 

 

1.3 각 Layer에서의 출력

 

1.4 학습할 Parameter 수

1.5 AlexNet 세부사항

이처럼 Conv1, Conv2, Conv4, Conv5 GPU 내부에서 특징맵 연산을하고 Conv3, FC6, FC7, FC8에서는 GPU간의 통신해서 특징맵 연산을 해줍니다

 

1.6 AlexNet 구현 - 가정

이제 AlexNet을 구현해보겠습니다. 먼저 AlexNet을 만들 때 가정한 점은 다음과 같습니다

 

첫 번째로, ImageNet 대신 Fashion-MNIST 데이터셋을 사용했습니다. 왜나면 일단 ImageNet의 데이터셋은 너무 큽니다. 학습시키는 데에 시간이 너무나도 많이 걸립니다. 그렇다고 일반 MNIST를 사용시 너무 쉬우니 Fashion-MNIST 데이터셋을 사용했습니다. 이때, Fashion-MNIST의 크기는 (28 x 28 x 1)이고 ImageNet의 크기는 (224 x 224 x 3)입니다. 그러므로 AlexNet의 구조를 그대로 사용시, 입력이미지가 너무 작아지기에, 위 그림처럼 layer를 조금 줄였습니다.

 

두 번째로, LRN 계층은 효과가 없기에 Batch Normalization을 대신 써줬습니다

 

세 번째로, 가중치 최적화는 Adam을 사용하였습니다.

 

네 번째로, Overfitting을 방지하기 위해 Data Augmentation을 사용하였습니다. 

 

 

1.7 AlexNet 구현 - AlexNet_Class 파일

다음은 AlexNet을 구현하기 위해 AlexNet을 클래스로 구현한 파일입니다

가져올 라이브러리들은 다음과 같습니다

 

이 클래스는 _layers 라는 리스트변수에 AlexNet에서의 각 Layer에 대해 정의해줍니다. 앞에서의 그림처럼, Conv1, Pool1을 통과한 뒤 바로 Conv Layer 3개를 통과하고, FC Layer를 지나는 과정을 거칩니다. 또한 AlexNet이 호출될 때 아래의 call 메서드를 보면, 그냥 말 그대로 _layers 리스트변수에 저장된 원소들을 차례로 실행합니다

 

1.8 AlexNet 구현 - AlexNet_eval 파일

다음은 위에서 만든 AlexNet_Class 파일의 AlexNet 클래스를 사용하여 학습을 진행하고 시험을 해보는 파일입니다

가져올 라이브러리들은 다음과 같습니다. 이 때 앞에서 만든 AlexNet 클래스를 가져옵니다

하이퍼파라미터를 다음과 같이 정의하였고, dataset_test, dataset_train 변수에 Fashion-MNIST 데이터셋을 저장해줍니다 그 후, 이 데이터셋에 대해 정규화 + 셔플 + 배치를 해줍니다. 또한 Data augmetation을 위해 datagen 이라는 변수를 선언해줍니다. 그 후, AlexNet 객체를 생성해주고 이 모델에 대해 요약한 정보를 출력하게 합니다

 

입력값에 대해 원핫라벨한 뒤, 교차엔트로피를 통과시키는 loss_object 변수를 선언하고, optimizer에는 Adam을 저장합니다. 그리고 훈련시와 시험시의 lossaccuracy를 저장할 변수를 선언해줍니다.

train_step은 모델의 결과값과 레이블을 체크하고 역전파를 구하고, 훈련 데이터에 대한 loss와 accuracy를 구하는  함수이고 

test_step은 시험 데이터에 대한 loss와 accuracy를 구하는 함수 입니다

 

이제 훈련과 시험을 해줍니다. 우선 100에폭에 대해 반복문을 실행하는데, 먼저 훈련데이터에 대해 실행합니다. 이때 data augmetation된 훈련데이터셋을 만들어 주고, 훈련을 해줍니다, 그 후 시험데이터셋에도 같은 과정을 해줍니다.

그 결과값인 lossaccurtacy를 리스트변수인 train_accuraciestest_accuracties에 추가해주고 각 파라미터들에 대해 출력을 합니다

 

1.9 AlexNet 구현 - 실행 결과

다음과 같이 신경망의 요약본이 나오게 되고 

 

신경망을 100에폭 동안 훈련과 시험을했을 때 lossaccuaracy가 나오게 됩니다. 이 때 AlexNet 모델의 성능은 91.72%가 됩니다

 

AlexNet.py
0.01MB
AlexNet_class.py
0.00MB