본문 바로가기

growth-log

심층 합성곱 신경망_ AlexaNet과 VGGNet16

Deep Learn수업을 들으며 관련 모델을 구현하고, 약간의 추가적인 진행을 해보았다.

이틀에 걸쳐 진행했으며 구글의 Colab을 이용했고, GPU의 어마어마한 위력을 느낄수 있었다. 

 

첫번째 시도는 여러모로 획기적인 모델이었던 AlexNet이다. 

ReLU함수를 처음으로 모델 적합에 시도하고, 병렬처리와 GPU로 연산에 소요되는 시간을 개선했다.

또한 데이터에 대한 정규화의 개념을 도입하고 미러링, 랜덤크롭, PCA성분분석등을 통한 다양한 방법의

데이터 증강을 시도했다. ( 드롭아웃도 적용된 모델이다 )

 

교수님께서 적용하신 대로 CPU를 적용해서 10번의 에포크를 돌리려고 했으나 매번 연결이 끊어졌다.

그도 그럴것이 에포크 당 50분이 걸렸다. 두번 시도했으나, 8번째 에포크를 넘기지 못했다.

그런데, GPU로 런타임을 바꾸고는 10분만에 결과가 나왔다. 정확도는 0.76으로 여러가지 상황을

생각했을때 나쁘지만은 않다는 생각이 들었다.  

 

1) AlexNet의 기본구성 

- 5개의 합성곱과 3개의 완전연결층 

- 2개의 GPU로 연산을 처리할수 있는 병렬적인 구조로 설계 

- ReLU, LRN, Overlapping Pooling, Data Augmentation, Dropout적용

   (Overlapping Pooling, LRN은 현재는 기능 개선에 큰 도움이 되지 않아 사용되지 않음)

- 출력층 Softmax함수 (1,000개의 클래스 분류)

 

2. AlexNet실습예제 구성

- keras모듈사용, cifar10에서 데이터셋 로드

- BatchNormalization(LRN을 제외하고 일반적인 정규화적용)

- CIFAR-10 dataset 사용

 

① 모듈, 데이터 준비 및 전처리 

 

② 모델 컴파일, 학습 및 학습결과 

- 0.76의 정확도, 0.3351의 Loss

 

 

두번째 시도는 VGGNet 16이다. 

VGGNet은 신경망을 적층하는 시도를 하는 모델이다. 층이 쌓일수록 정확도가 향상됨을 이용해서

단순한 형태(블록)의 층을 적층해서 성능향상을 시도했다. 

특징맵에 3x3 convolution 연산을 여러번 적용함으로써 가중치를 감소시켜 연산량을 조절하여, 

학습속도를 개선하고 메모리의 사용을 줄였다. 해당 실습의 경우는 초기에 학습 정확도가 매우 낮게

나타나 총 3번에 걸쳐 조건을 변경해 출력을 관찰하였다. 

 

1차 모델의 적합은 AlexaNet의 예제와 같이 CIFAR-10 dataset 사용하였고, 32 x 32의 이미지를

( 원래 VGG모델의 컨셉과 유사하게) 224 x 224로 사이즈를 변경하여 입력으로 활용했다.

데이터의 갯수는 수업과 동일하게 Training Set 2000개, Test Set 500개로 적합을 했는데,

뭔가 잘못 구성한 것인지 의심이 될 정도로 낮은 정확도가(0.07)  출력되었고, 학습을 여러번 추가로 진행해도

10%이하의 낮은 정확도는 전혀 개선되지 않았다. 

 

2차 모델의 적합은 ( 교수님이 말씀하신 대로 데이터의 리사이즈가 문제인 걸로 추측되어) 입력 데이터를

원본 사이즈로 수정하였다. 여러번의 학습으로 Training Set의 정확도가 0.9 부근까지 개선되었으나

에포크마다 변동이 심하게 나타나고, Test Set으로 예측한 정확도는 0.4수준으로 차이가 많아 과적합으로

판단되었다.  

 

3차 모델의 적합은 CIFAR-10 dataset에서 Training을 위한 데이터를 늘려  20000개와 40000개로 

설정해 보았다.(Test Set은 25% 수준) 데이터 갯수를 2만개로 설정한 경우, 학습 정확도는 0.78, Test Set

일반화의 정확도는 다소 낮은 0.67로 나타났다.

4만개인 경우는 학습 정확도는 0.9, Test Set검증의 경우는 0.76으로, 학습할 모델에 충분한 양의 데이터가

주어져야만 적절한 결과가 도출될수 있다는 것을 확인할수 있었다. 

 

3. VGGNet 16(D) 기본구성 

- 입력데이터 크기 : 224 x 224 , 3채널 

- 합성곱 :  패딩(same), 스트라이드 1설정 (VGG는 기본적으로 CNN의 블록으로 구성)

- Pooling : 최대 풀링 2 x 2, 스트라이드 2, 이미지 크기 1/4로 줄어듬 

 

 

4. VGGNet 16(D) 실습결과_1

- 2000개 데이터, 모델의 원래 컨셉에 맞게 224x 224로 리사이즈하여 학습

 

① 모델학습  

- 32 x 32의 데이터를 VGG16 모듈의 원 특징에 맞게 224  x 224로 resize

 

② 테스트 셋을 이용한 일반화의 정확도 확인 

- 0.07의 정확도, 여러번 학습시에도 개선되지 않음 

 

 

5. VGGNet 16(D) 실습결과_2

- 2000개 데이터, 32 x 32로 이미지 크기를 원상태대로 설정하여 학습 

- 1회 ~ 4회 동일한 조건의 학습을 반복 

 

 모델학습 ( 1회 ) 

- 정확도 0.3 (기존의 0.07에 비해 뚜렷한 개선을 보임)

 

② 동일 조건에 대한 추가 학습(2~4회)에 따른 정확도 개선 

- Training Set의 정확도는 점차 증가, Test Set을 이용한 일반화 시 정확도는 증가하지 않음

 


6. VGGNet 16(D) 실습결과_3

- 32 x 32의 원 이미지로 데이터를 10배, 20배로 늘려 학습  (데이터 각 20000, 40000개, 테스트셋 20%)

- 데이터 수량에 따라 테스트셋에 대한 일반화의 정확도가 유의하게 증가함 

 

 

최종 실습의 적합 결과그래프에서 과적합으로 보이지는 않았으나 드롭아웃을 적용하면 어떻게 될지 궁금했다.

또한 다른 개선 포인트도 적용해보고자 하였으나, 데이터 수량을 늘리면서 구글 클라우드 사용가능 용량이 급격히 감소해

추가적인 테스트를 진행하지는 못했다. 

VGGNet은 AlexaNet과 비교하여 볼때 4만개의 데이터만으로 (6만개의 데이터를 전부 사용한) AlexNet과 유사한

성능을 나타내며( GPU를 이용하여 연산시간이 워낙 짧아 뚜렷한 차이가 관찰되지는 않았지만) 연산속도도 향상된

것으로 판단된다.

 

-----------------------------------------------------------------------------------------------------

학습중에 교수님이 제안하신 코드를 구현한 것입니다. 틀린 부분이 있을수도 있으며, 저작권 문제가 있다면 내리겠습니다.