4 분 소요

8장: 합성곱 신경망(CV)

VGG16 Neural Network Visualization


https://youtu.be/RNnKtNrsrmg?si=-hg1sRdYe6QE3irO&t=180 https://youtu.be/pj9-rr1wDhM?si=oP40uA_PMinnFtUN https://youtu.be/WQYCK1YpsjE?si=dDmoWRm4fbS7NBW9 ![[Pasted image 20240928160340.png]]

합성공 신경망 소개


합성곱 연산


layers.Dense(Fully Connected Layer) 와 layers.Conv2D(Convolutional Layer)

layers.Dense

입력 특성 공간에 있는 전역 패턴을 학습한다.

  • 단점: Image가 고해상도가 될 경우 파라메터 수의 급증, 공간적 특성이 직렬화로 인해 무시

layers.Conv2D:

입력 특성 공간에 있는 지역 패턴을 학습한다. 1) 학습된 패턴은 평행 이동 불변성을 갖는다. (translation invariant):

  • 컨브넷이 고양이의 귀 모양을 이미지의 오른쪽 아래에서 학습했다면, 동일한 필터를 사용하여 이미지의 왼쪽 위에서도 고양이의 귀 모양을 인식할 수 있다.
  • 사람이 보는 것과 동일하게 평행 이동으로 다르게 인식되지 않는다.
  • 적은 수의 훈련 샘플을 사용해 일반화 능력을 가진 표현을 학습할 수 있다. (why?)
    • 이미 학습된 패턴을 새로운 위치에서 다시 학습할 필요가 없다.

2) 컨브넷은 패턴의 공간적 계층 구조를 학습할 수 있다.

  • 예를 들어 첫 번째 합성곱 층은 고양이의 얼굴에서 ‘얼굴 라인’, ‘귀 라인’, ‘눈 주위 라인’ 등의 지역 패턴을 학습한다.
  • 두 번째 합성곱 층은 ‘고양이의 눈’, ‘고양이의 코’, ‘고양이의 귀’와 같이 더 큰 패턴을 학습한다.
  • 이렇게 이러한 패턴들의 계층 구조를 통해 효과적으로 학습한다.

합성곱 연산 이해


합성곱 연산의 경우 특성 맵(feature map)이라고 부르는 랭크-3 텐서에 적용 ![[Pasted image 20240928160907.png]]

  • (height, width, channel)

    입력 특성 맵의 랭크-3 텐서:

  • RGB 이미지(3개의 컬러를 가진다.) => (height, width, 3)
  • 흑백 이미지(1개의 컬러, 회색 톤) => (height, width, 1)

출력 특성 맵의 랭크-3 텐서:

  • 깊이 축인 channel의 경우 층의 매개변수로 결정되므로 상황에 따라 다르다.
  • 깊이 축인 channel은 더 이상 컬러를 의미하지 않는다.
## filters=32가 깊이가 된다.
layers.Conv2D(filters=32, kernel_size=3, activation="relu") 

합성곱 연산

![[Pasted image 20240928161037.png]]

  • 입력 특성 맵에서 필터의 크기에 따른 작은 패치들이 추출되고 필터 연산을 통해 출력 특성 맵을 만든다.
  • 필터 (=커널 or 마스크): 가중치 행렬
  • 가중치 필터 연산 후에 활성화 함수에 적용한다.

합성곱의 핵심적인 2개의 파라미터

  • 입력으로부터 뽑아낼 패치의 크기: 3X3 or 5X5 를 전형적으로 많이 사용
  • 특성 맵의 출력 깊이: 합성곱으로 계산할 필터의 수
  • 예시: 스트라이드 = 1, 패딩 없음

| 입력 특성 맵 | 합성곱 층의 커널 크기 | 출력 특성 맵 | | ———- | ———— | ———- | | (26,26,32) | (3,3,32,64) | (24,24,64) |

  • 입력 특성 맵에서 추출된 패치 하나의 크기를 보면 (3,3,32) 이다.
  • 이 패치와 필터(3,3,32)가 각 위치의 값들의 곱하고 3X3X32개의 모든 값들을 더해서 (1,)의 값을 낸다.

입력의 (높이, 너비) 와 출력의 (높이, 너비)가 다른 이유

  • 경계 문제 -> 입력 특성 맵에 패딩을 추가하여 대응할 수 있다.
  • 스트라이드의 사용 여부에 따라 다르다.

경계 문제와 패딩 이해하기

  • 패딩 : 입력과 동일한 높이와 너비를 가진 출력 특성 맵을 얻고 싶을 경우 ![[Pasted image 20240928161251.png]]
  • 가장자리에 적절한 개수의 행과 열을 추가한다.
  • valid : 패딩을 사용하지 않는다
  • same : 입력과 동일한 높이와 너비를 가진 출력을 만들기 위해 패딩한다.
  • 스트라이드 : 필터가 입력 특성 맵을 지나갈 때 뛰어넘는 크기 ![[Pasted image 20240928161324.png]]

최대 풀링 연산


최대 풀링(Max pooling)과 평균 풀링(Average pooling)

  • 최대 풀링: 입력 패치의 최댓값을 추출하여 다운샘플링한다. ![[Pasted image 20240928161428.png]]

  • 더 잘 작동하는 편
  • 특성이 특성 맵의 각 타일에서 어떤 패턴이나 개념의 존재 여부를 인코딩하는 경향이 있기 때문

평균 풀링: 입력 패치의 평균값을 추출하여 다운샘플링한다.

  • 가장 납득할 만한 서브샘플링 전략
    1. 스트라이드가 없는 합성곱으로 조밀한 특성 맵을 만들기
    2. 작은 패치에 대해 최대로 활성화된 특성을 고르기(최대 풀링)

소규모 데이터셋에서 밑바닥부터 컨브넷 훈련하기


데이터 증식(data augmentation): 컴퓨터 비전에서 과대적합을 줄이기 위한 강력한 방법

모델 구성하기


컨브넷의 특징

  • 특성 맵의 깊이는 모델에서 점진적으로 증가하지만, 특성 맵의 크기는 감소합니다.
  • 거의 모든 컨브넷에서 볼 수 있는 전형적인 패턴 ![[Pasted image 20240928161630.png]] ![[Pasted image 20240928161643.png]] ![[Pasted image 20240928161702.png]]

데이터 증식 사용하기


Dropout 증식층 방법 기법, 이미지 만들어지는 방법, 과대적합 줄이기 위한 방법

여러 개 데이터 증식 층 (data augmentation layer) 추가할 수 있음 하지만 테이터 증식은 기존 정보의 재조합만 가능 ⇒ (적은 수의 원본 샘플로 만들었기에) 데이터간 상호 연관성이 크다 ⇒ 과적합 억제하기 위해선 Dropout 층 추가해야 함

데이터 증식 & 드랍아웃 코드

inputs= keras.Input(shape=(180, 180, 3)) x= data_augmentation(inputs)

x= layers.Rescaling(1./255)(x) x= layers.Conv2D(filters=32, kernel_size=3, activation="relu")(x) 
x= layers.MaxPooling2D(pool_size=2)(x) 
x= layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x) 
x= layers.MaxPooling2D(pool_size=2)(x) 
x= layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x) 
x= layers.MaxPooling2D(pool_size=2)(x) x= layers.Conv2D(filters=256, kernel_size=3, activation="relu")(x) 
x= layers.MaxPooling2D(pool_size=2)(x) 
x= layers.Conv2D(filters=256, kernel_size=3, activation="relu")(x) 
x= layers.Flatten()(x) x= layers.Dropout(0.5)(x) 

outputs= layers.Dense(1, activation="sigmoid")(x) 
model= keras.Model(inputs=inputs, outputs=outputs) 

model.compile(loss="binary_crossentropy", optimizer="rmsprop", metrics=["accuracy"])
  • 멍멍이 사진 데이터 증식 코드 예시
    data_augmentation= keras.Sequential( 
      [ 
        layers.RandomFlip("horizontal"), # 랜덤하게 50% 이미지 수평 뒤집기
        layers.RandomRotation(0.1), # 회전 layers.RandomZoom(0.2), # 확대, 축소 
        ] 
    )
    

사전 훈련된 모델 활용하기


작은 이미지 데이터셋에 딥러닝을 적용하는 방법은 사전 훈련된 모델을 사용하는 것 사전 훈련된 모델(pretrained model): 일반적으로 대규모 이미지 분류 문제를 위해 대량의 데이터셋에서 미리 훈련된 모델

  • 사전 훈련된 모델을 사용한 특성 추출 ![[Pasted image 20240928162120.png]]

특성 추출

컨브넷의 경우 연속된 합성곱과 풀링 층으로(합성곱 기반 층, convolutional base) 시작해서 밀집 연결 분류기(Classifier)로 끝난다.

  • 컨브넷 특성 추출의 경우
    1. 사전에 훈련된 모델의 합성곱 기반 층을 선택하여 새로운 데이터를 통과
    2. 그 출력으로 새로운 분류기를 훈련

왜 합성곱 층만 사용할까? 밀집 연결 분류기도 재사용할 수 있을까?

  • 합성곱 층에 의해 학습된 표현이 더 일반적이어서 재사용이 가능하기 때문이다.(ex. 선, 점)
  • 훈련된 합성곱 기반 층이 더 일반적으로 표현되어서 재사용이 가능
    • 하지만 분류기의 경우 학습한 표현은 모델이 훈련된 클래스 집합에 특화
  • 분류기는 전체 사진에 어떤 클래스가 존재할 확률에 관한 정보만 담고 있다.

사전 훈련된 모델 미세 조정하기


네트워크 미세 조정하는 단계

  1. 사전에 훈련된 합성곱 기반 네트워크 위에 새로운 네트워크를 추가합니다.
  2. 합성곱 기반 네트워크를 동결합니다.
  3. 새로 추가한 네트워크를 훈련합니다.
  4. 합성곱 기반 네트워크에서 일부 층의 동결을 해제합니다. (배치 정규화 층은 동결 해제하면 안 됩니다. )
  5. 동결을 해제한 층과 새로 추가한 층을 함께 훈련합니다. ⇒ 상위층 특성화된 인코딩 함. 새로운 문제에 재활용하도록 수정필요한 부분 “구체적 특성”⇒ 미세조정 상위층에서 한다! ![[Pasted image 20240928162344.png]]

댓글남기기