Etc/Deep Learning

6장 합성곱 신경망Ⅱ(2) - 이미지 분류를 위한 신경망(AlexNet)

z.zzz 2021. 8. 10. 19:59

복습 - CNN 구조(3차원 구조)

* 이미지를 다루므로 기본적으로 3차원 데이터(너비, 높이, 깊이)를 다룸

 

AlexNet

구성 : 합성곱층 5개 + 완전연결층 3개     //맨 마지막 완전연결층 : 카테고리 1,000개로 분류(소프트맥스 활성화 함수 사용)

특징 : GPU 2개를 기반으로 한 병렬 구조(⇒ 연산 속도가 빨라짐)

 

AlexNet의 합성곱층에서 사용된 활성화 함수 : 렐루

각 계층의 구조적 세부 사항

  • 입력 : 227×227×3 크기의 RGB 이미지
  • 출력 : 각 클래스(혹은 카테고리)에 해당하는 1000×1 확률 벡터
계층 유형 특성 맵 크기 커널 크기 스트라이드 활성화 함수
이미지 1 227×227
합성곱층 96 55×55 11×11 4 렐루(ReLU)
최대 풀링층 96 27×27 3×3 2
합성곱층 256 27×27 5×5 1 렐루(ReLU)
최대 풀링층 256 13×13 3×3 2
합성곱층 384 13×13 3×3 1 렐루(ReLU)
합성곱층 384 13×13 3×3 1 렐루(ReLU)
합성곱층 256 13×13 3×3 1 렐루(ReLU)
최대 풀링층 256 6×6 3×3 2
완전연결층 4096 렐루(ReLU)
완전연결층 4096 렐루(ReLU)
완전연결층 1000 소프트맥스(Softmax)

 * 합성곱층 크기₂ : (크기₁ - 필터 크기 + 2패딩) / 스트라이드 + 1

 - 첫 번째 합성곱층

  •     커널 크기 : 11×11×3
  •     스트라이드 : 4
  •     특성맵 : 96개 생성

        ⇒ 출력 : 55×55×96

 ✔ 첫 번째 계층을 거치며,

  • GPU-1 : 주로 컬러와 상관없는 정보를 추출하기 위한 커널이 학습됨
  • GPU-2 : 주로 컬러와 관련된 정보를 추출하기 위한 커널이 학습됨

각 GPU의 결과

GPU-1 · 2 적용 결과

 

 

 

예제 - AlexNet 모델 생성

원래 AlexNet의 마지막 계층에는 뉴런이 1000개 있지만 예제에서는 클래스 두 개만 사용

합성곱 신경망을 구축하는 데 Model Subclassing API를 사용

 

1. 모델 생성

  - 데이터셋은 개와 고양이

num_classes = 2
class AlexNet(Sequential):
    def __init__(self, input_shape, num_classes):
        super().__init__()
        self.add(Conv2D(96, kernel_size=(11, 11), strides=4, padding='valid', activation='relu',
                   input_shape=input_shape, kernel_initializer='he_normal'))    
        self.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid', data_format='channels_last'))
    ...
    self.add(Flatten())
    self.add(Dense(4096, activation='relu'))
    self.add(Dense(4096, activation='relu'))
    self.add(Dense(1000, activation='relu'))
    self.add(Dense(num_classes, activation='softmax'))
    self.compile(optimizer=tf.keras.optimizers.Adam(0.001),
                    loss='categorical_crossentropy',
                    metrics=['accuracy'])

kernel_initializer; 가중치 초기화

 가중치 초기화 방법

   · 확률 분포 기반의 가중치 초기화

   : 특정한 확률 분포에 기반해 랜덤한(임의의) 값을 추출하여 가중치를 초기화

 - 균일 분포 : 최솟값과 최댓값 사이의 값들이 동일한 확률로 추출됨

(-0.05에서 0.05 사이의 값을 동일한 확률로 추출하도록 설정되어 있음)

- 정규 분포 : 종 모양의 분포, 평균에 가까운 값일 수록 더 높은 확률로 추출

(평균이 0, 표준편차가 0.05인 정규 분포에서 값을 추출하도록 설정되어 있음)

 

   · 분산 조정 기반의 가중치 초기화

    : 확률 분포 기반으로 추출한 값으로 가중치를 초기화하되, 이 확률 분포의 분산을 가중치별로 동적으로 조절

    ✔ 분산 조절엔 해당 가중치에 'fan in'과 'fan out'이 사용됨

📝Note. fan in과 fan out
· fan in : 해당 계층에 들어오는 입력 텐서의 차원 크기
· fan out : 해당 계층이 출력하는 출력 텐서의 차원 크기
 예) 1000×200 크기의 완전 연결층 - fan in : 1000, fan out : 200
  * 텐서 : 3차원 이상의 배열 형태

  - LeCun 초기화 방식

       - 입력값의 크기가 커질수록 초기화 값의 분산을 작게 만듦(⇒ 결과 : 0에 가까운 값이 추출됨)

       - 종류 lecun_uniform, lecun_normal

  - Xavier 초기화 방식 :

       - fan in과 fan out을 모두 고려하여 확률 분포를 계산

           eCun 방식에서 2를 곱한 후 fan in과 fan out을 합한 크기로 나누어 준 값으로 확률 분포를 조정

       - 종류 : glorot_uniform, glorot_normal

       - 활성화 함수로 하이퍼볼릭 탄젠트를 사용하는 신경망에서 많이 사용됨(렐루에선 잘 작동X)

  - He 초기화 방식

       - Xavier 방식의 한계를 극복위해 제안된 기법. Xavier방식에서 fan out을 제거함

         (== fan out보다 fan in에 집중한 가중치)

       - 종류 : he_uniform, he_normal

       - ResNet을 학습시킬때 해당 기법을 사용하면 CNN의 깊은 신경망을 잘 학습시킬 수 있음

 

data_format; 입력에 대한 형식을 지정

  입력 형식 설정 파라미터 종류

    - channels_last : 입력 데이터 텐서의 형식이 (배치 크기, 높이, 너비, 채널 개수)가 됨

    - channels_first : 입력 데이터 텐서의 형식이 (배치 크기, 채널 개수, 높이, 너비)가 됨

 

2. 데이터 호출 및 데이터셋 전처리(증가)

  - AlexNet은 파라미터를 6000만 개 사용

  - 충분한 데이터가 없으면 과적합이 발생

  ✔ 예제는 충분한 규모의 데이터가 아님 → 작은 데이터셋을 사용하여 강력한 성능을 낼 수 있는 전처리가 필요(ImageDataGenerator를 사용)

 

3. 텐서보드 설정 및 모델 훈련

텐서보드 - 모델 훈련 결과 시각화

· AlexNet 정확도

train : 주황색, valid : 파란색

· AlexNet 오차

train : 주황색, valid : 파란색

  → 성능이 좋지 않음

 

4. 분류에 대한 예측 & 예측 결과 시각화

예측 결과가 좋지 못함 → 파라미터에 대한 튜닝 必

성능 높이는 방법 : 더 많은 이미지 데이터를 사용, 파라미터 조정