본문 바로가기

AI/Computer Vision

[실전! 컴퓨터 비전을 위한 머신러닝] 03. 이미지 비전 (2)

728x90
반응형

모듈식 아키텍처

더 복잡한 빌딩 블록 - 모듈 고안

 

인셉션

인셉션V3 - 3x3 및 1x1 컨볼루션 필터만을 사용

데이터와 훈련을 기반으로 네트워크가 선택할 수 있는 몇 가지 대안을 제공

여러 경로의 출력이 최종 특징 맵으로 이어 붙여짐

 

아키텍처 - 다중 경로 컨볼루션 모듈들의 시퀀스


 

스퀴즈넷

채널 수가 1x1 컨볼루션만큼 감소하는 수축 단계와 채널 수가 다시 증가하는 팽창 단계가 교대로 있음

마지막 레이어는 전역 평균 풀링 - 가중치 수 줄임

각 모듈의 컨볼루션 레이어 3개 중 2개는 1x1 컨볼루션 - 학습 가중치 수 줄임 (?)

 

'발화 모듈'

    def fire(x, squeeze, expand):
        y  = tf.keras.layers.Conv2D(filters=squeeze, kernel_size=1, activation='relu', padding='same')(x)
        y = tf.keras.layers.BatchNormalization()(y)
        y1 = tf.keras.layers.Conv2D(filters=expand//2, kernel_size=1, activation='relu', padding='same')(y)
        y1 = tf.keras.layers.BatchNormalization()(y1)
        y3 = tf.keras.layers.Conv2D(filters=expand//2, kernel_size=3, activation='relu', padding='same')(y)
        y3 = tf.keras.layers.BatchNormalization()(y3)
        return tf.keras.layers.concatenate([y1, y3])
   def fire_module(squeeze, expand):
        return lambda x: fire(x, squeeze, expand)

아키텍처 - 병렬 3x3 및 1x1 컨볼루션으로 구축된 단순화 된 컨볼루션 모듈


 

레즈넷과 스킵 연결

 

스킵 연결

  • 신호를 있는 그대로 전달한 다음, 하나 이상의 컨볼루션 레이어에 의해 변환된 데이터와 재조합함

 

잔차 블록

  • 스킵 연결로 인해 건너뛰게 된 일련의 레이어
  • 데이터의 높이, 너비, 채널 수를 보존해야함

모든 컨볼루션 레이어 렐루 활성화, 배치 정규화 사용

Resnet50, ResNet100 등 네트워크 깊게 확장 가능

 

<스킵 연결은 최적화 단계에서 네크워크를 통해 경사가 흐르는데 도움을 줌>

1. 스킵연결에서 신경망 레이어의 목표 = 입력과 원하는 최종 출력 사이의 델타 혹은 잔차 출력

2. 잔차 연결이 네트워크를 실제로 더 얕게 만듦

3. 훈련 중에 최적화된 손실 함수의 토폴로지 환경에 주목함 

 

아키텍처 - 스킵 연결이 있는 컨볼루션 모듈


 

덴스넷

이전에 계산된 모든 특징을 보기 때문에 얕은 컨볼루션 사용 가능

특징을 재사용 가능 - 컨볼루션 레이어당 필요로 하는 필터 수가 적음

밀집 블록

- 덴스넷의 기본 빌딩 블록 

 

밀집 블록과 풀링 레이어가 교번되어 덴스넷 네트워크를 이룸

얕은 컨볼루션 레이어 (예: K=32)를 사용

 

아키텍처 - 스킵 연결의 조밀한 네트워크가 있는 컨볼루션 모듈


 

깊이 분리 가능 컨볼루션

ex. 3x3x8 필터 16개

1. 이미지의 높이와 너비에 걸쳐 모든 입력채널에 3x3 필터가 적용

2. 필터링된 출력은 채널 간에 다양한 방식으로 재조합

 

▶ 비효율적

 

깊이 분리 가능 컨볼루션, 분리 가능 컨볼루션

- 독립적인 필터 세트를 사용해 채널별로 입력을 필터링한 다음, 1x1 컨볼루션을 사용해 개별적으로 출력을 결합함

- 각 공간 필터를 여러 번 재창조할 필요가 없으므로 학습 가능 가중치 측면에서 저렴함

깊이 승수(depth muliplier)

새로운 필터 가중치로 1단계 필터 연산을 반복함으로써 채널 수를 두세 배 늘릴 수 있음

tf.keras.layers.SeparableConv2D(filters, 
                                kernel_size,
                                strides=(1,1),
                                padding='valid',
                                depth_multiplier=1)

depth_multiplier 파라미터 추가


엑셉션

분리 가능 컨볼루션 + 레즈젯 방식의 스킵 연결

모든 컨볼루션 레이어 렐루 활성화 함수, 배치 정규화 사용

모든 분리 가능 컨볼루션은 1의 깊이 승수 사용

잔차블록 - 3x3 분리 가능 컨볼루션 사용

 

아키텍처 - 깊이 분리 가능(depth-separable) 컨볼루션 레이어에 기초한 잔차 블록들


신경 아키텍처 검색(Neural Architecture Search) 설계

나스넷

자동화 알고리즘으로 기본 셀들의 구조를 설계하고, 적절한 파라미터로 셀을 쌓아 컨볼루션 아키텍처를 조립.

결과 네트워크를 훈련해 어떤 모듈 설계가 가장 효과적인지 확인

 

일반 셀과 축소 셀

분리 가능 컨볼루션을 두 배씩 사용

 

N과 M 파라미터를 조정하여 나스넷의 규모를 키울 수 있음

렐루 활성화, 배치 정규화 사용

 

아키텍처 - 복잡함, 기계적 생성(machine-generaged)

 

모바일넷군

모바일넷V2, 후속 버전 - 엠나스넷, 이피션트넷

 

깊이별 컨볼루션

깊이 분리 가능 컨볼루션 분할 구성요소

1. 깊이별 컨볼루션이라고 하는 공간 필터링 부분

2. 1X1 컨볼루션

tf.keras.layers.DepthwiseConv2D(kernel_size,
                                strides=(1,1),
                                padding='valid',
                                depth_multiplier=1)

분리 가능 컨볼루션

tf.keras.layers.SeparableConv2D(filters=128, kernel_size=(3,3))

순차적으로 표현

tf.keras.layers.DepthwiseConv2D(kernel_size=(3,3))
tf.keras.layers.Conv2D(filters=128, kernel_size=(1,1))

 

 

역전된 잔차 병목

채널 수가 적은 곳에 스킵 연결을 배치하고 잔차 블록 내의 채널 수를 늘림

 

역전된 잔차 블록의 마지막 1x1 컨볼루션은 비선형 활성화가 뒤따르지 않음


MobileNetV2

내부(N) 및 외부 채널 깊이(M)는 파라미터로 받음

모든 컨볼루션 레이어 배치 정규화 사용

활성화 함수 ReLU6, 그 뒤에 표준 렐루 활성화 함수 (마지막 컨볼루션 레이어는 활성화 함수 사용 X)

 

아키텍처 - 역전된 잔차 병목을 순차적으로 배치


이피션트넷(EfficientNet): 모든 것을 한데 모으기

 

엠나스넷(MnasNet) - 자동화 알고리즘이 5x5 컨볼루션 다시 도입

 

이피션트넷 - > 컨볼루션 아키텍처를 확장하는 방법

1. 레이어를 추가

2. 레이어별 채널을 추가

3. 입력 이미지의 해상도를 높임

 

역전된 장차 병목의 외부 채널과 내부 채널 수 사이의 승수는 첫번째 행 = 1, 나머지 = 6

 

아키텍처 - 역전된 잔차 병목들을 순차적으로 배치


컨볼루션 너머: 프랜스포머 아키텍처

 

<트랜스포머 아키텍처의 주요한 혁신>

주의 집중 : 각 단어를 예측할 때 텍스트 시퀀스 중 일부분에 집중함

위치 인코딩 : 입력 단어에 어떤 단어가 있는지 뿐만 아니라, 각 단어의 문장 내에서의 위치를 나타냄

 

        patches = tf.image.extract_patches(
            images=images,
            sizes=[1, self.patch_size, self.patch_size, 1],
            strides=[1, self.patch_size, self.patch_size, 1],
            rates=[1, 1, 1, 1],
            padding="VALID",
        )

입력 이미지를 작은 조각으로 쪼갬

 

encoded = (tf.keras.layers.Dense(...)(patch) + 
		   tf.keras.layers.Embedding(...)(position))

조각의 픽셀값과 이미지 내에서의 위치를 이어붙임으로써 조각을 표현함

     x1 = tf.keras.layers.LayerNormalization(epsilon=1e-6)(encoded_patches)
        # Create a multi-head attention layer.
        attention_output = tf.keras.layers.MultiHeadAttention(
            num_heads=num_heads, key_dim=projection_dim, dropout=0.1
        )(x1, x1)
        # Skip connection 1.
        x2 = tf.keras.layers.Add()([attention_output, encoded_patches])
        # Layer normalization 2.
        x3 = tf.keras.layers.LayerNormalization(epsilon=1e-6)(x2)
        # MLP.
        # 다중 퍼센트론, 밀집 레이어의 집합
        x3 = mlp(x3, hidden_units=transformer_units, dropout_rate=0.1)
        # Skip connection 2.
        encoded_patches = tf.keras.layers.Add()([x3, x2])

 

어텐션 출력(attention output)은 조각 표현을 강조하는 구실을 함

 

ViT 아키텍처는 컨볼루션망 모델보다 더 많은 데이터를 요함.

ViT모델을 대량의 데이터로 사전 훈련한 뒤에 더 작은 데이터셋으로 파인튜닝할 것을 권함


모델 고르기

 

성능 비교

104 flowers 데이터셋 처음부터 훈련

- 엑셉션(Xception)이 가장 성능 좋음

 

앙상블

여러 모델을 동시에 사용해 예측을 결합

- 모델들이 예측한 클래스 확률의 평균을 내는 것

- 로짓의 평균에 소프트맥스를 적용해 클래스 확률을 계산하는 것

 

권장되는 전략

데이터셋이 매우 작을 때 (라벨당 이미지 1000개 미만) - 전이학습 사용

중간 크기 데이터셋 (라벨당 이미지 1000~5000개) - 파인튜닝

대규모 데이터셋 (라벨당 이미지 5000개 이상) - 처음부터 훈련

 

 

 

 

 

728x90
반응형