스터디/Deep Learn

5. Deep CNN

elenalee 2024. 9. 27. 08:54

1. AlexNet (ReLU, 데이터증강, 드롭아웃)

ILSVRC(ImageNet LargeScale VisualRecognition Challenge, 2010 ~ 2017) 

2012 Winner 

- 2010,2011년 (전통적 비전, 정확도 70~75%), 2012~2015년 (딥러닝, 정확도 85~95%)

AlexNet을 토대로 Deep Learning시작 (16.4%에러율,  압도적인 성능으로 1위)

- 256 x 256의 이미지,  1000개의 레이블 - 데이터 증강으로 120만 학습, 5만 검증, 15만개 테스트

 

1) AlexNet의 구조

(1) 기본 구성

- 5개의 합성곱3개의 완전연결층, 풀링층 3개 

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

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

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

 

(2) 기본 구성

C1 : 합성곱 11 x 11 x 3 크기의 필터 96개, 227x227 55x55 , 96개 , ReLU함수

        풀링    3 x 3 의 오버래핑, stride 2,  55x55  27x27 , 96개의 특징맵  

C2 : 합성곱 5 x 5 x 48 크기의 필터 48개, stride 1, 패딩 2, 병렬처리, ReLU함수 

                   27x27, 96개   27x27 , 256개 특징맵 (병렬 128개씩) 

        풀링    3 x 3 의 오버래핑, stride 2,  55x55  13x13 , 256개의 특징맵 

C3 : 합성곱 3 x 3 x 256 크기의 필터  384개, stride 1, 패딩 1, 병렬처리, ReLU함수

                  13 x 13 , 256개    13 x 13, 384개 특징맵 (병렬 192개씩) 

C4 : 합성곱 3 x 3 x 192 크기의 필터 192개, stride 1, 패딩 2, 병렬처리, ReLU함수

                  13 x 13, 384개   13 x 13, 384개 특징맵 (병렬 192개씩) 

C5 : 합성곱 3 x 3 x 192 크기의 필터 128개, stride 1, 패딩 2, 병렬처리, ReLU함수

                  13 x 13, 384개   13 x 13, 256개 특징맵 (병렬 128개씩) 

        풀링    3 x 3 의 오버래핑, stride 2,  13 x 13  6x6 , 256개의 특징맵

F6 : 6 x 6  x 128 x 2 (병렬 구성) 특징맵을 1차원 벡터로 변형 (256x256 pixel의 컬러)

        9,216개의 ( 6 x 6 x 256 )의 1차원 벡터를 4,096(병렬 2,048)개의 뉴런과 완전연결, ReLU

        예) Dense(4096, ReLU) 

F7 : F6와 같이 4,096개의 뉴런이 완전연결로 구성, ReLU

F8 : 1000개의 출력누런으로 연결, Softmax적용, 1,000개의 카테고리에 포함될 확률로 출력 

 

2) AlexNet의 특징

(1) ReLU Nonlinearity (이전에는 Tanh, Sigmoid 사용)

 - 학습속도가 빠르고 에러율 감소 : 에러율 25%이하, 학습시간 6배 단축

 - ReLU로 값이 커져 주변 뉴런에 영향을 미치는 것을 방지 -> 정규화 의미로 LRN(인접픽셀 영향최소화)

 

(2) Training on Multiple GPUs

 - GTX 580 3GB GPU (CPU학습시 오랜 50~60일의 작업을  5~6일로 단축)

 - 2개의 병렬처리 기법으로 학습시간을 획기적 단축 (순차기법 아님)

 

(3) LRN(Local Response Normalization)

 - 특정 위치의 픽셀값이 높으면 다른 특징맵의 동일 위치에 있는 값을 통해 정규화

   ( 인접 픽셀에 영향을 주는 것을 방지 , 현재 배치 정규화로 대체되어 잘 사용되지 않음 ) 

 

(4) Overlapping Max Pooling 

 - 이전 풀링 영역과 겹치는 부분을 포함하여 풀링, 3x3 오버래핑 최대풀링을 stride 2로 수행 

   (최근에는 잘 사용하지 않는 방법)

 

3) Overfitting Reducing (과적합 해소)

(1) Data Augmentation (미러링, 크롭, PCA로 데이터 증강)

Mirroring 

   - 이미지의 좌우 반전을 적용하여 이미지 양을 2배로 증가

   - 256 x 256 컬러 이미지 1,000여개의 다양한 카테고리로 구성 

Random Crops

   - 데이터를 임의로 잘라 이미지를 추가적으로 생성 

   - 데이터 2,048배 증가 ( 256 x 256 이미지 일부를 227 x 227로 자르는 Crop(크롭)적용)

PCA Color Augmentation

   - PCA(주성분 분석)을 통해 이미지 특성을 유지하고 RGB컬러값을 이동/변경하는것 

   - 이미지의 채널별 분산활용 

 

(2) Dropout

- 학습중 은닉층 노드 일부의 연결을 생략 (50%적용), 2012년 힌튼에 의해 소개된 기술

- overfit 방지 (co-adoption(노드간 상호적응, 의존성) 배제)

 

3) 실습예제 구성

- keras모듈사용, cifar10에서 데이터셋 로드, 데이터처리함수 up_utils import

- BatchNormalization(정규화), Dropout적용시 일반적으로 합성곱 - 정규화 - 드롭아웃으로 구성

- CPU사용 (GPU X), 출력은 10개 (1000개에서 줄임)

- 레이블 One-Hot Encoding, 오차함수 : categorical entropy

- CIFAR-10 dataset 사용

 

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

 

2. VGGNet ( 크기가 적은 필터로 다층, 연산량 감소)

- 옥스퍼드 대학의 Visual Geometry Group(VGG)연구소에서 개발된 모델

- 심플한 모델로 층을 깊게 구성 ( ILSVRC 2014년 준우승 ) , 이해하기 쉬운 구조와 우수한 성능 

- 다양한 층으로 구성 (가중치와 층수를 모델명에 붙여 명명) 예)VGGNet 16(D), VGGNet 19(E)

- 합성곱 층인 conv(X)-(Y)는 필터의 크기 X,Y를 의미, Conv3-512 : 3x3필터 512개

- AlexNet의 LRN성능향상에 큰 효과가 없어 미적용 

- 층이 깊어질수록 에러율 감소확인(11→13→16→19)

 

1) VGGNet 16(D)

(1) 기본 구성

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

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

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

 

 

2) VGGNet 16 특징

(1) 3 x 3크기의 필터(Conv3)만 사용, 필터 연산을 여러번 적용하여 특징맵을 줄이고 가중치 낮춤 

 - 10 x 10 데이터에 3 x 3 필터적용하여 3번의 convolution연산: 4x4의 feature map (27개의 가중치)

   ( 10 x 10 데이터에 7 x 7 필터적용하면 4x4의 feature map, 49개의 가중치 ) 

- 가중치는 학습에 의해 최적화 : 가중치가 적으면 연산량이 감소, 학습속도는 향상, 메모리 사용량 감소

- 신경망 층수가 깊어짐 : (활성함수를 통한) 비선형성이 증가, 학습이 잘되도록 영향을 미칠수 있음

 

3) 실습예제 구성

- VGGNet의 입력은 224 x 224 x 3, 합성곱층 패딩 SAME(1), stride 1

- 최대풀링 2x2, 스트라이드 2로 이미지 크기가 1/4로 축소 

- keras의 model, layers에서 필요한 클래스, cifar10에서 데이터셋 로드, 수치계산용 numpy

- keras의 input은 모델의 입력을 정의하기 위한 기능제공 

- cv2는 OpenCV라이브버리를 사용하여 이미지 데이터처리 (데이터 리사이즈)

 

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

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

 

② 모델 정의하기

- 객체를 생성하고 chaining하여 모델 구성 ( Sequential, add방법을 이용할수도 있음)

- 64, 128, 256, 512필터를 가지는 Conv2D(), MaxPool2D(), Flatten(), Dense()

- layers.Conv2D(x, (3,3), activation="relu", padding='same')

   MaxPooling2D((2,2), strides=(2,2))

 

③ 학습 및 정확도 확인 

- sparse_categorical_crossentropy 손실함수 (데이터 레이블이 정수형 ??)

   Adam 옵티마이저, 10epochs

- x_test와 y_test를 사용하여 모델을 평가, 정확도 출력 

- 테스트 정확도가 매우 낮음 ( 여러번 진행해도 유사하게 1% 이하의 정확도 ) 

 

④ 추가학습 : 32 x 32로 이미지 크기를 원상태대로 설정하여 학습 

- 32 x 32의 원 이미지로 1~4회 학습  

 

- 추가 학습 후 경향성 출력

  (Training Set의 정확도는 점차 증가, Validation은 증가하지 않음)  

추가학습 : 32 x 32로 이미지 크기를 원상태대로 설정하고 데이터 추가 

- 32 x 32의 원 이미지로 데이터를 10배, 20배로 늘려 학습  

 

3. GoogLeNet  ( 인셉션 모듈 

- 2014년 구글 연구팀에서 개발된 모델, ILSVRC 2014 Winner (에러율 6.7%)  

- 인셉션 모듈로 층을 깊게 하여(22층) 성능향상 

 

1) GoogLeNet의 구조

 

(1) 기본 구성

 일반 인셉션 모듈 (전체적으로 유사한 구성을 가짐)

   - 다양한 크기의 필터의 연산을 병렬적으로 수행하여 여러 종류의 특징맵 형성

     ( 합성곱 1x1+3x3+5x5 +최대풀링 3x3 : 다양한 필터, 계산량 증가 )

   - 1x1 의 필터는 특징맵의 수 줄여 차원축소 (계산량 감소)

차원축소가 반영된 Inception 모듈

 

1 x 1 필터의 효과 (차원 축소)

 

② 보조 분류기 사용 ( 완전 연결층 _ 평균풀링+합성곱+완전연결층+완전연결층+출력층)

 

(2) 구글넷의 부분별 구조

①시작 부분 ( 7x7 CNV + 3x3 P + 1x1 CNV + 3x3 CNV + 3x3 P), 정규화 LRN

- 메모리의 효율적 사용을 위해 기본적인 합성곱 모델 적용

- 시작 부분에 인셉션 모듈배치시 성능개선 효과가 없음 

 

② 중간 부분

- 새로운 구조인 보조 분류기를 중간 부분 두곳에 배치, 층이 깊어지면서 발생되는 경사소멸문제 해결

- 보조분류기 : 역전파 결과를 확인하여 기울기 조정 및 정규화 효과가 나타나도록 함

  ( 파라미터와 웨이트를 세밀하게 조정 )

 인셉션(3a)-인셉션(3b)-풀링-인셉션(4a)-인셉션(4b)-인셉션(4c)-인셉션(4d)-풀링-인셉션(5a)-인셉션(5b)

 

③ 끝 부분

- 이전층 결과를 하나의 연속된 값으로서 풀링, 완전연결층 구성 

- 최대풀링대신 전역평균풀링(Global Average Pooling, 특징맵 각채널을 평균하여 스칼라로 압축)

   이전 층에서 추출된 특징맵의 각각의 평균을 연속적인 1차원 벡터로 함 (완전연결 Dense층 대체)

   예) 1000개의 특징맵에 대해 1000개의 값이 나오도록 조정하면 Flatten없이 사용가능

- 최종적으로 이미지 분류를 위한 소프트맥스 적용하여 결과출력 

 

2) 구글넷의 특징

(1) 일반 인셉션 모듈

- 3개의 합성곱층 (1x1, 3x3, 5x5 )과 3x3의 최대풀링층으로 구성 

- 합성곱층의 결과와 최대풀링층의 결과를 연속된 하나의 값으로 연결해, 다음단계의 입력으로 활용

 

(2) 차원축소가 적용된 인셉션 모듈 

- 일반 인셉션 모듈에서 1x1 크기의 합성곱층을 추가로 배치한 구조

- 합성곱 층의 결과를 연속된 하나의 값으로 연결

- 인셉션 모듈 적용을 통해 성능이 2~3배 향상

 

1x1 합성곱층의 효과

- 고차원 데이터에서 저차원으로 변환, 특징맵 수를 줄이는 목적으로 사용

- 특징맵의 수가 감소할수록 연산량 감소 

- 차원축소를 통해 적당한 수(특징이 강한?)의 특징맵을 사용시 성능에 영향을 미치지 않았다고 함

 

3) 실습예제 구성

- 모델을 구성하기 위해 Conv2D, MaxPool2D, Dense, concatenate, GlobaAveragePooling2D,

   AveragePooling2D, Flatten(보조분류기에 사용), LearningRateScheduler(epoch기반으로

   learning rate조정), 최적화 알고리즘은 SGD

- ( 224x224로 입력하면 32 x 32원본 데이터에 대한) 학습 정확도 매우 낮게 나타남

 

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

- to_categorical 함수로 One-Hot Encoding, 손실함수 categorical_crossentropy

- callbacks ( learning_rate조절함수 decay생성 )

   kernel_init (커널 가중치 초기화 : glorotform : input/out수에 맞게 연결가중치 초기화) 

② inception모듈, decay함수 구현 및 가중치 및 바이어스 초기화하기

모델 정의하기 

- 시작부분의 입력에 Conv2D()적용, MaxPool2D()로 특징추출 

 

학습 및 정확도 확인 

- 모델은 SGD 옵티마이저와 3개의 categorical_crossentropy손실함수 사용

- LearningRateSchedulerepoch에 따라 학습률 조정 (decay함수로 세부조정)

4. ResNet

- 2015년 MS북경 연구소에서 개발된 모델, ILSVRC 2015 우승 (에러율 3.57%) 

- 152개층 구조, 잔차학습방식 도입  

- 동일한 형태의 구성을 반복하여 단순한 구성으로 적층 

 

1) ResNet

- 잔차 학습 ( 합성곱층과 숏컷 층을 연결)

- 초반의 7x7 합성곱층 외에 3x3합성곱 층을 연결, 특징맵의 크기가 절반 감소시 필터의 수 2배

 

(1) ResNet의 기본 구성

- 깊은 층인 경우에도 모델의 성능이 우수하지는 않음 ( 20층과 56층 모델의 성능을 실험 )

학습과 테스트의 에러율

 

① 잔차 학습 ( Residual Learning )

- 기존 신경망 학습의 목적은 목적함수를 모델링하는 것 (기존 학습층은 하나의 입력이 두개의 층을 거침)

   학습한 정보를 보존하지 않고 변형시키게 되며, 출력 y=H(x)를 산출 

- 기존 신경망 학습에서 출력과 입력의 차(H(x)-x)를 얻을수 있도록 목표를 수정

   입력에서 바로 출력으로 연결되는 숏컷 연결(스킵 연결)추가해 각 블록들이 작은 정보만을 추가적으로

   학습하도록 구성 

2) 실습예제 구성

- 잔차를 이용한 연결과 일반 연결을 구성하여 적층 

 

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

 

② 잔차 클래스, 모델정의

- ResidualUnit()은 반복적 수행을 통해 다양한 크기의 필터를 가지는 계층구성

  ( keras.Layer를 상속한 클래스로서 함수 호출시 오버라이드된 call함수 작동 )

 

 모델 학습 및 결과

 

 개선

- 32x32, 데이터 2000개

- 32x32, 데이터 10000개 (테스용셋 2000개)

 

'스터디 > Deep Learn' 카테고리의 다른 글

6. AutoEncoder & GAN , RNN  (0) 2024.09.29
4. CNN Basic & LeNet5  (0) 2024.09.27
3. 프레임 워크와 학습 기술  (0) 2024.09.25
2. MLP  (0) 2024.09.23
1. 인공신경망과 퍼셉트론  (0) 2024.08.31