6.케창딥 - 합성곱 신경망(CV)
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
or5X5
를 전형적으로 많이 사용 - 특성 맵의 출력 깊이: 합성곱으로 계산할 필터의 수
- 예시: 스트라이드 = 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]]
- 더 잘 작동하는 편
- 특성이 특성 맵의 각 타일에서 어떤 패턴이나 개념의 존재 여부를 인코딩하는 경향이 있기 때문
평균 풀링: 입력 패치의 평균값을 추출하여 다운샘플링한다.
- 가장 납득할 만한 서브샘플링 전략
- 스트라이드가 없는 합성곱으로 조밀한 특성 맵을 만들기
- 작은 패치에 대해 최대로 활성화된 특성을 고르기(최대 풀링)
소규모 데이터셋에서 밑바닥부터 컨브넷 훈련하기
데이터 증식(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)로 끝난다.
- 컨브넷 특성 추출의 경우
- 사전에 훈련된 모델의 합성곱 기반 층을 선택하여 새로운 데이터를 통과
- 그 출력으로 새로운 분류기를 훈련
왜 합성곱 층만 사용할까? 밀집 연결 분류기도 재사용할 수 있을까?
- 합성곱 층에 의해 학습된 표현이 더 일반적이어서 재사용이 가능하기 때문이다.(ex. 선, 점)
- 훈련된 합성곱 기반 층이 더 일반적으로 표현되어서 재사용이 가능
- 하지만 분류기의 경우 학습한 표현은 모델이 훈련된 클래스 집합에 특화
- 분류기는 전체 사진에 어떤 클래스가 존재할 확률에 관한 정보만 담고 있다.
사전 훈련된 모델 미세 조정하기
네트워크 미세 조정하는 단계
- 사전에 훈련된 합성곱 기반 네트워크 위에 새로운 네트워크를 추가합니다.
- 합성곱 기반 네트워크를 동결합니다.
- 새로 추가한 네트워크를 훈련합니다.
- 합성곱 기반 네트워크에서 일부 층의 동결을 해제합니다. (배치 정규화 층은 동결 해제하면 안 됩니다. )
- 동결을 해제한 층과 새로 추가한 층을 함께 훈련합니다. ⇒ 상위층 특성화된 인코딩 함. 새로운 문제에 재활용하도록 수정필요한 부분 “구체적 특성”⇒ 미세조정 상위층에서 한다! ![[Pasted image 20240928162344.png]]
댓글남기기