(TIL) 72일차_Deep Learning_CNN_VGGNet&ResNet

2014, VGG넷

: AlexNet(2012) dml 8계층 모델 2배 깊이(레이어)의 네트워크 훈련에 성공했다

=> 이것은 ImageNet Challenge에서 AlexNet의 오류율을 절반(16.4 > 7.3)으로 줄였습니다.

  • 16-19 레이어와 같은 심층 신경망 모델의 학습 성공 => 3×3 필터를 사용했기 때문입니다. 깊은 층을 만들기 위해이 VGG의 키는 l입니다.에이어의 깊이가 미치는 영향 그것은 6개의 구조에 대한 연구로 시작되었습니다.


  • 모든 컨벌루션 레이어에서 3×3 필터만 사용됩니까? => 3×3 컨볼루션 두 개를 겹치면 5×5 컨볼루션 하나의 수용 영역이 같기 때문입니다. 활성화 기능은 각 레이어에 사용할 수 있습니다. 결정 기능의 비선형성 증가그리고 매개변수 수 감소 효과학습률을 높입니다.

2015. 레스넷

: Residual Block에서 파생되어 deep network를 학습하는 방법으로 residual learning을 제안하여 deep layer의 성능을 향상시켰다.

딥 레이어 구성 문제: 기본적으로 VGGNet을 통한 딥러닝에서 층이 깊을 때 성능이 더 좋을줄 알았는데 네트워크를 19계층(VGGNet)보다 깊게 만들어서 테스트를 해보니, 56층의 결과는 20층의 결과보다 나빴다.

=> 레이어가 깊을 때 그래디언트 소실수업 폭발 또는 하락이 발생했습니다

ResNet은 잔차입니다.의 사전적 의미를 이용하여 열화를 해결하였습니다.


잔차 블록 : 네트워크 최적화의 어려움 감소

=> 기존의 신경망은 H(x) = x가 되도록 학습시켰으나, H(x)를 한번에 학습하기는 어려우므로 대신 f(x) = H(x)-x로 학습한다. H(엑스) F처럼 전체를 배우는 것보다(x)와 x를 따로 계산하여 난이도를 낮춥니다.


지름길 : 기울기 손실을 방지하고 학습에 역할을 합니다. 2개의 컨벌루션 레이어마다 잔여 블록으로 지름길을 만들고 차원을 변경하며 레이어를 겹칩니다. 이는 VGG-19 모델의 196억 FLOP에서 ResNet 모델의 36억 FLOP로 FLOP(계산 복잡도)를 줄였습니다.

  • 식별 바로 가기: 이것은 일반적으로 입력 및 출력의 차원이 동일할 때 사용됩니다.
  • 프로젝션 바로가기 : 입력과 출력의 차원이 다를 때 차원증가 테크닌으로 추가된 바로가기

병목 현상 잔차 블록 : ResNet50 이상에서는 GoogLeNet에서 사용하는 병목 잔차 블록을 중첩하여 연산량을 줄입니다.

=> 1×1 컨볼루션은 파라미터가 작기 때문에 feature map을 줄이거나 늘릴 때 사용합니다.

배치 정규화(BN) : 기울기 손실 및 혼잡 문제를 방지하여 학습 과정을 전체적으로 안정화시키는 방법입니다. 평균과 분산을 조정하는 과정은 별도의 과정이 아니라 신경망에 포함되어 학습 과정에서 평균과 분산을 함께 조정한다.

=> 나머지 블록은 Batch Normalization(BN)을 사용하며 Conv-BN-ReLU 순으로 배치한다.

2017. SENet : Squeeze_and_Excitation_Networks

: 성능은 유지하면서 딥러닝 모델 파일의 크기를 줄이는 것이 목표입니다. 또한 소량의 추가 계산 SE 블록 추가로 인한 매개변수 증가에 비해 모델 성능 및 개선이 매우 큽니다.

SE 블록의 가장 큰 장점은 기존 CNN 아키텍처에 붙여서 사용할 수 있습니다.그게

Q. 왜 딥 러닝 모델 파일 크기줄이기 위해 노력해야 할까
=> 1) 분산 환경에서 쉽게 배울 수 있고, 2) 모델 파일을 단말 장치로 전송하는데 유리하고, 3) 저사양 용광로에서 사용할 수 있다.

SE 블록(Squeeze-Excitation 블록) : 컨볼루션을 통해 생성 속성은 채널당 중요도를 고려하여 재조정됩니다.하다.

  • Squeeze(Fsq): GAP를 이용하여 각 채널의 중요 정보만을 추출하여 각 채널의 대표 스칼라 값을 생성합니다.
  • 여기(Fex): 추출된 정보를 채널별 종속성으로 재조정하여 가중치를 계산합니다.


CNN 과정

model = models.Sequential((
  tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),  # 첫레이어 input_shape설정
  tf.keras.layers.MaxPooling2D((2, 2)),  # pool_size 는 윈도우의 크기를 의미하며 수직, 수평 축소 비율을 지정
  tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),  # 필터의 수=64, 커널사이즈=(3,3)
  tf.keras.layers.MaxPooling2D((2, 2)),  # (2, 2)이면 출력 영상 크기는 입력 영상 크기의 반으로 줄어듬
  tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),  # 필터의 수=64, 커널사이즈=(3,3)
  tf.keras.layers.Flatten(),  # 추출된 특징을 전결합층에 전달하기 위해 배열 형태로 flat(흑백2D or 컬러3D → 1D)
  tf.keras.layers.Dense(64, activation='relu'),  # 클래스 분류를 위한 완전 연결 계층(FC) 추가
  tf.keras.layers.Dropout(0.2),  # 과대적합을 피하기 위해 드롭아웃을 레이어에 적용하여 20%를 무작위로 드롭아웃
# 0.1, 0.2, 0.4 등의 값을 입력하면 해당 층에서 출력 단위의 10%, 20% 또는 40%를 임의로 제거
  tf.keras.layers.Dense(10, activation='softmax') ))   # 10개의 노드를 소프트맥스 함수로 확률 반환(전체 합=1)

– Conv2D

tf.keras.layers.Conv2D(
    filters, kernel_size, strides=(1, 1), padding='valid', input_shape=(28, 28, 1),
    data_format=None, dilation_rate=(1, 1), groups=1, activation=None,
    use_bias=True, kernel_initializer="glorot_uniform",
    bias_initializer="zeros", kernel_regularizer=None,
    bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
    bias_constraint=None, **kwargs)
더보기

필터 : 컨볼루션 필터 수 >> 필터 수 = 특징 맵 수

kernel_size : 컨볼루션 커널의 (행, 열) >> 필터 크기

: 경계 처리 방법

– ‘유효’: 유효한 영역만 출력합니다. 따라서 출력 이미지 크기는 입력 크기보다 작습니다.

– ‘same’ : 출력 이미지 크기가 입력 이미지 크기와 동일합니다.

input_shape : 모델의 첫 번째 레이어일 때만 정의하면 됩니다(배치 크기높이, 너비, 채널)

활성화 : 활성화 기능을 설정합니다.

– ‘linear’: 기본 값, 입력 뉴런과 가중치로 계산된 결과값 그대로 출력

– ‘relu’: 주로 히든 레이어에 사용되는 정류기 기능

– ‘sigmoid’: 이진 분류 문제의 출력 레이어에서 주로 사용되는 시그모이드 함수

– ‘softmax’: 다중 클래스 분류 문제에서 출력 계층에 주로 사용되는 소프트맥스 함수

– MaxPool2D

tf.keras.layers.Flatten(
    data_format=None, **kwargs)

– 평평하게

tf.keras.layers.Flatten(
    data_format=None, **kwargs)
더보기

data_format : 문자열, channels_last(기본값) 또는 channels_first. 입력의 차원 순서

– 조밀한

tf.keras.layers.Dense(
    units, activation=None, use_bias=True,
    kernel_initializer="glorot_uniform",
    bias_initializer="zeros", kernel_regularizer=None,
    bias_regularizer=None, activity_regularizer=None, 
    kernel_constraint=None, bias_constraint=None, **kwargs)
더보기

단위 : 출력값의 크기

활성화 : 활성화 기능

use_bias : 바이어스 사용 여부(b)

kernel_initializer : 가중치(W) 초기화 함수

bias_iniotializer : 바이어스 초기화 함수

kernel_regularizer : 가중치 정규화 방법

bias_regularizer : 바이어스 정규화 방법

activity_regularizer: 출력 값을 정규화하는 방법

kernel_constraint : 가중치에 적용된 추가 제약 함수

bias_constraint : 편향에 적용된 추가 제약 함수

* 출력 레이어

회귀의 출력

>> tf.keras.layers.Dense(1)

이진 분류의 출력

>> tf.keras.layers.Dense(1,activation=’시그모이드’)

멀티클래스 출력

>> tf.keras.layers.Dense(n,activation=’softmax’)

훈련 전 데이터 입력

loss=”categorical_crossentropy”인 경우 종속 변수 데이터(y)의 전처리: 레이블을 범주로 인코딩합니다. 활성화 함수를 적용하려면 y 값이 0과 1로 구성되어야 적용됩니다.

from tensorflow.keras.utils import to_categorical
# to_categorical는 클래스 벡터(정수)를 이진 클래스 행렬로 변환
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)