[AI/Hands-on ML] - [핸즈온 머신러닝] 14장 - 합성곱 신경망을 사용한 컴퓨터 비전 (CNN 구조)
14. 4 CNN 구조
- 합성곱 층을 몇 개 쌓고(+Relu), 풀링 층을 쌓고, 이를 반복하는 식
- 네트워크를 통과할수록 이미지는 점점 작아지지만, 합성곱 층 때문에 점점 더 깊어짐 (= 더 많은 특성 맵을 가짐)
- 맨 위층에는 몇 개의 완전 연결 층(+Relu)으로 구성된 일반적인 피드포워드 신경망이 추가되고
- 마지막 층(ex. 클래스 확률 추정을 위한 소프트맥스 층)에서 예측을 출력
model = keras.models.Sequential([
DefaultConv2D(filters=64, kernel_size=7, input_shape=[28, 28, 1]),
keras.layers.MaxPooling2D(pool_size=2),
DefaultConv2D(filters=128),
DefaultConv2D(filters=128),
keras.layers.MaxPooling2D(pool_size=2),
DefaultConv2D(filters=256),
DefaultConv2D(filters=256),
keras.layers.MaxPooling2D(pool_size=2),
keras.layers.Flatten(),
keras.layers.Dense(units=128, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(units=64, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(units=10, activation='softmax'),
])
- 첫 번째 층은 64개의 큰 필터(7x7)와 스트라이드 1 사용
- 이미지가 28x28 픽셀 크기이고 하나의 컬러 채널이므로 input_shape=[28, 28, 1] 로 지정
- 풀링 크기가 2인 최대 풀링 층을 추가하여 공간 방향 차원을 절반으로 줄임
- 위 구조를 두 번 반복 - 최대 풀링 층이 뒤따르는 합성곱 층이 두번 등장
- 이미지가 클 때는 이 구조를 더 많이 반복
- CNN이 출력층에 다다를수록 필터 개수가 늘어남(64->128->256)
- 저수준 특성의 개수는 적지만, 이를 연결해 고수준 특성을 만들 수 있기 때문에 이런 구조를 사용
- 풀링 층 다음에 필터 개수를 두 배로 늘리는 것이 일반적임
- 풀링 층이 공간 방향 차원을 절반으로 줄이므로 이어지는 층에서 특성 맵 개수를 두 배로 늘릴 수 있음
- 그 다음이 두 개의 은닉층과 하나의 출력층으로 구성된 완전 연결 네트워크
- Dense 네트워크는 샘플 특성으로 1D 배열을 기대하므로 입력을 일렬로 펼침
- Dense 층 사이에 과대적합을 줄이기 위해 드롭아웃 층을 추가
14. 4. 1 LeNet-5
1998년에 만들어져 MNIST에 널리 사용된 CNN 구조
- C1 layer : 32x32 이미지를 6개의 필터(5x5)와 합성곱 연산 수행 -> 6장의 28x28 특성 맵을 얻음
- 특성맵이 6개인 이유는 각 필터마다 특성맵이 나오기 때문
- 제로패딩이므로, 32x32에서 28x28로 줄어듬 (이미지가 네트워크를 진행하면서 점점 크기가 줄어듦)
- S2 layer : 평균 풀링 층에서 각 뉴런은 입력의 평균을 계산한 다음, 그 값에 학습되는 계숫값을 곱함
그리고 학습되는 값인 편향을 더한 후, 마지막으로 활성화 함수를 적용
- 2x2 필터를 stride 2로 설정하여 특성맵이 절반으로(14x14)으로 축소됨
- C3 layer : 6장의 14x14 특성맵으로부터 16장의 10x10 특성맵이 산출됨
- C3의 대부분의 뉴런은 S2의 6개 맵 전체가 아니라 3~4개 맵에 있는 뉴런에만 연결 됨
- 6장의 14x14 특성맵에서 연속된 3장씩을 모아 5x5x3 사이즈의 필터와 합성곱 -> 6장의 10x10 특성맵 산출
- 6장의 14x14 특성맵에서 연속된 4장씩을 모아 5x5x4 사이즈의 필터와 합성곱 -> 6장의 10x10 특성맵 산출
- 6장의 14x14 특성맵에서 불연속 4장씩을 모아 5x5x4 사이즈의 필터와 합성곱 -> 3장의 10x10 특성맵 산출
- 6장의 14x14 특성맵 모두를 가지고 5x5x6 사이즈의 필터와 합성곱 -> 1장의 10x10 특성맵 산출
- => 총 16장의 10x10 특성맵 산출
- S4 layer : 평균 풀링 층, 특성 맵이 5x5 로 축소
- C5 layer : 16개의 5x5 를 받아 5x5 커널 크기의 합성곱을 수행하기 때문에 출력은 1x1 크기의 특성맵
- 이것들을 fully connected 형태로 연결하여 총 120개의 특성맵을 생성
- 이전 단계의 16장의 특성맵이 합성곱을 거치면서 다시 전체적으로 섞이게 됨
- F6 layer : Fully connected, C5의 결과를 84개의 unit에 연결
- 출력 layer : 입력과 가중치 벡터를 행렬 곱셈하는 대신 각 뉴런에서 입력 벡터와 가중치 벡터 사이의 유클리드 거리를 출력
- 각 출력은 이미지가 얼마나 특정 숫자 클래스에 속하는지 측정
- 요즘은 잘못된 예측을 줄여주고 그래디언트 값이 크고 빠르게 수렴되기 때문에 크로스 엔트로피 비용함수를 선호
14. 4. 2 AlexNet
- 2012년 17%의 에러율을 달성하며 이미지넷 대회에서 우승
- LeNet-5 와 비슷하며 더 크고 깊은 구조
- 처음으로 합성곱 층 위에 풀링 층을 쌓지 않고 합성곱 층끼리 쌓음
- 과대적합을 줄이기위해 두 가지 규제 기법 사용
- 훈련하는 동안 F9, F10 출력에 드롭아웃을 50% 비율로 적용
- 훈련이미지를 랜덤하게 이동하거나 수평으로 뒤집고 조명을 바꾸는 식으로 데이터 증식을 수행
- LRN 이라 부르는 경쟁적인 정규화 단계 사용 (C1, C3층의 ReLU 단계 후에 사용)
- 가장 강하게 활성화된 뉴런이 다른 특성 맵에 있는 같은 위치의 뉴런을 억제함
- 특성 맵을 각기 특별하게 다른 것과 구분되게 하고, 더 넓은 시각에서 특징을 탐색하도록해 일반화 성능을 향상시킴
※ LRN은 현재는 많이 사용되지 않음
14. 4. 3 GoogLeNet
- 구글 리서치 개발, top-5 에러율 7% 이하
- 네트워크가 이전 CNN보다 훨씬 깊음
- 인셉션 모듈 이라는 서브 네트워크를 통해 이전의 구조보다 효과적으로 파라미터를 사용 (AlexNet보다 10배 적은 파라미터를 가짐)
- '3x3+1(S)' => 3x3 커널, 스트라이드 1, 'same' 패딩 사용
- 처음에 입력 신호가 복사되어 네 개의 다른 층에 주입
- 두 번째 합성곱 층은 각기 다른 커널 크기(1x1, 3x3, 5x5)를 사용하여 다른 크기의 패턴을 잡음
- 모든 층은 스트라이드 1과 same 패딩을 사용하므로 출력의 높이와 너비가 모두 입력과 같음
-> 모든 출력을 깊이 연결 층에서 깊이 방향으로 연결할 수 있음(위쪽 네 개의 합성곱 층에서 만든 특성 맵을 쌓음)
- 텐서플로의 axis=3(깊이 방향 축) 매개변수로 tf.concat() 이용해 구현 가능
인셉션 모듈의 1x1 커널의 합성곱 층
- 깊이 차원을 따라 놓인 패턴을 잡을 수 있음
- 입력보다 더 적은 특성 맵을 출력하므로 병목 층 역할 담당(차원↓) - 연산 비용과 파라미터 개수를 줄여 훈련 속도를 높이고 일반화 성능 향상
- 합성곱 층의 쌍([1x1, 3x3], [1x1, 5x5])이 더 복잡한 패턴을 감지할 수 있는 한 개의 강력한 합성곱 층처럼 작동
=> 여러 크기의 복잡한 패턴이 담긴 특성 맵을 출력하는 합성곱 층의 역할
GoogLeNet 구조
- 합성곱 층과 풀링 층에서 출력되는 특성 맵 수는 커널 크기 앞에 표시
- 네트워크를 하나로 길게 쌓은 구조
- 9개의 인셉션 모듈 포함
- 인셉션 모듈에 있는 여섯 개 숫자는 모듈 안에 있는 합성곱 층에서 출력하는 특성 맵의 수
- 처음 두 층 : 계산 양을 줄이기 위해 높이와 너비를 4배로 줄임 (※)
- LRN 층 : 이전 층이 다양한 특성을 학습하도록 만듦
- 이어지는 두 개의 합성곱 층 중 첫 번째 층은 병목층으로 작동하며, 이 두 층은 하나의 똑똑한 합성곱 층 역할을 함
- LRN 층 : 이전 층이 다양한 특성을 학습하도록 만듦
- 최대 풀링 층 : 계산 속도를 높이기 위해 이미지 높이와 너비를 2배로 줄임
- 9개의 인셉션 모듈 및 최대 풀링 층(차원 감소와 속도 향상을 위함)
- 전역 평균 풀링 층 : 각 특성 맵의 평균 출력, 공간 방향 정보 잃음 - 이 층에서 수행된 차원 축소 덕분에 CNN 위에 몇 개의 완전 연결 층을 둘 필요가 없음(파라미터 수 감소, 과대적합 위험 감소)
- 출력 층 : 규제를 위한 드롭아웃 층 다음, 1000개 유닛과(1000개의 클래스가 있으므로) 소프트맥스 활성화 함수를 적용한 완전 연결 층으로 클래스 확률 추정 값 출력
- 실제 GoogLeNet 구조는 세 번째와 여섯 번째 인셉션 모듈 위에 연결된 두 개의 부가적인 분류기를 포함함
- 하나의 평균 풀링 층, 합성곱 층, 두개의 완전 연결층, 소프트맥스 활성화층으로 구성
- 훈련시 여기서의 손실이 전체 손실에 더해짐
- 그래디언트 소실 문제를 줄이고 네트워크 규제가 목적
※ same 패딩 (=제로패딩) 사용시 출력 크기는 커널 크기에 영향받지 않아, 단순히 입력 크기를 스트라이드 수로 나눈 값이 됨
14. 4. 4 VGGNet
- 네트워크의 깊이가 주는 영향에 대한 연구로부터 개발됨
- 2~3개의 합성곱 층 뒤에 풀링 층이 나오고, 다시 2~3개의 합성곱 층과 풀링 층이 등장하는 방식
- 마지막 dense 네트워크는 2개의 은닉층과 출력층으로 이루어짐
- VGGNet은 많은 개수의 필터를 사용하지만 3x3 필터만 사용함 => 깊은 네트워크 구조를 위해 작은 필터 사용 (3x3은 left, right, up, down을 고려할 수 있는 최소한의 receptive field임)
- 결과적으로 깊은 네트워크를 통해 높은 정확도를 달성할 뿐만 아니라, 단순한 파이프라인으로 우수한 성능을 보여준 모델
14. 4. 5 ResNet
- ILSVRC 2015 대회에서 우승
- 3.6% 이하의 에러율
- 우승한 네트워크는 152개 층으로 구성된 매우 깊은 CNN 사용
- 더 적은 파라미터를 사용해 더 깊은 네트워크로 모델을 구성하는 트렌드를 만듦
=> 깊은 네트워크를 훈련시킬 수 있는 핵심 요소는 스킵 연결(숏컷 연결) - 어떤 층에 주입되는 신호를 상위 층의 출력에도 더해줌
잔차학습
- 본래 신경망을 훈련시킬 때 목적함수 h(x)를 모델링하는 것이 목표
- 입력 x를 네트워크 출력에 더하여(스킵 연결 추가) 네트워크는 h(x) 대신 f(x)=h(x)-x 를 학습하게 만듦
- 일반적인 신경망을 초기화할 때는 가중치가 0에 가깝기 때문에 네트워크도 0에 가까운 값 출력
- 스킵 연결 추가시 신경망 초기화시 네트워크는 입력과 같은 값을 출력하게 됨
- 즉, 잔차학습에서 얻고자하는 출력값은 h(x)=f(x)+x이고, 모든 layer에서 gradient가 (f'(x)+1 이기 때문에) 최소 1이상은 갖게됨 -> gradient vanishing 문제 해결
- 목적 함수가 항등 함수에 매우 가깝다면 훈련 속도가 매우 빨라짐
- 스킵 연결을 많이 추가하면 일부 층이 학습되지 않았더라도 훈련 시작 가능
- 스킵 연결로 입력 신호가 전체 네트워크에 쉽게 영향을 미침
- 심층 잔차 네트워크는 스킵 연결을 가진 작은 신경망인 잔차 유닛(RU)을 쌓은 것
- 드롭아웃 층 제외 GoogLeNet과 똑같지만, 중간에 단순한 잔차 유닛을 깊게 쌓음
- 각 잔차 유닛은 배치 정규화(BN), ReLU, 3x3 커널을 사용하고 공간 정보를 유지하는 (stride 1, 제로패딩) 두 개의 합성곱 층으로 이루어짐
- 몇 개의 잔차 유닛마다 특성 맵 수는 두 배로 늘어나고 높이, 너비는 절반이 됨(스트라이드 2)
- 입력과 출력의 크기가 다르기 때문에 입력이 잔차 유닛의 출력에 바로 더해질 수 없고
- 이를 위해 스트라이드 2이고 출력 특성 맵 수가 같은 1x1 합성곱 층으로 입력을 통과시킨후 더해지게 됨
14. 4. 6 Xception
- GoogLeNet 과 ResNet의 아이디어를 합쳤지만
- 인셉션 모듈을 깊이별 분리 합성곱 층 이라는 층으로 대체 (Depthwise separable convolution)
- 일반적인 합성곱 층이 공간상의 패턴(ex. 타원 형태)과 채널 사이의 패턴(ex. 입+코+눈=얼굴)을 동시에 잡기 위해 필터를 사용
- 분리 합성곱층은 공간 패턴과 채널 사이 패턴을 분리하여 모델링할 수 있다고 가정
깊이별 분리 합성곱 층(Depthwise separable convolution)
- Depthwise Separable Convolution은 입력 채널에 각각 독립적으로 3x3 convolution 수행
- 입력 채널이 5개면, 5개의 3x3 convolution 을 수행해 각각 입력값과 동일한 크기 특성맵을 생성
- 그리고 각 특성맵을 연결해 5채널의 특성맵 생성
- Pointwise Convolution은 모든 채널에 1x1 convolution을 수행하여, 채널 수를 조절함(그림예시:1x1x3 필터)
Xception은 위와 같은 Depthwise Separable Convolution을 수정해 inception 모듈 대신 사용함
- Pointwise convolution 이후에 Depthwise convolution을 사용
- input에 대해 1x1 합성곱을 거친 후, 모든 채널을 분리시켜 output channel마다 3x3 합성곱을 해줌
-> 두 방향(공간 / 채널)에 대한 매핑을 완전히 분리 가능
- 1x1 합성곱은 채널에 대한 연산들을 미리 해주고
- 3x3 합성곱은 x,y 도메인에 대한 연산을 해주는 역할로 분리
- 분리 합성곱층은 입력채널마다 하나의 공간 필터만 가지기 때문에, 입력층과 같이 채널이 너무 적은 층 다음에 사용하는 것을 피해야 함
- Xception 구조는 2개의 일반 합성곱층으로 시작함
- 나머지는 분리 합성곱만 사용
14. 4. 7 SENet
- ILSVRC 2017 우승
- 인셉션 네트워크과 ResNet 같은 기존 구조 확장
=> 각 SE-Inception 과 SE-ResNet 이라고 부름
- 2.25% 에러율
원래 구조에 있는 모든 유닛(모든 인셉션 모듈이나 모든 잔차 유닛)에 SE블록이라는 신경망을 추가
=> SE블록의 역할은 유익한 feature을 선택적으로 강조하면서, 덜 유용한 feature를 억제하는 것
1. SE블록이 추가된 부분의 유닛의 출력을 깊이 차원에 초점을 맞추어 분석
2. 어떤 특성이 일반적으로 동시에 가장 크게 활성화되는지 학습
3. 그 후 이 정보를 사용하여 특성맵을 보정
예를 들어,
1. SE블록이 그림에서의 입, 코, 눈을 학습할 수 있을때, 우리가 사진에서 입과 코를 보았다면 눈도 볼 수 있다고 기대
2. 따라서 입과 코 특성 맵이 강하게 활성화되고 눈 특성맵만 크게 활성화되지 않았다면 이 블록이 눈 특성 맵의 출력을 높임(= 관련없는 특성 맵 값을 줄임)
SE 블록 구조
하나의 SE 블록은 3개의 층으로 구성
- 전역 평균 풀링 층
- 각 특성 맵에 대한 평균 활성화 값을 계산
- 256개의 특성 맵을 가진 입력이라면, 각 필터의 전반적인 응답 수준을 나타내는 256개의 숫자가 출력됨
- ReLU 활성화 함수를 사용하는 밀집 은닉층
- 이전보다 훨씬 더 적은 뉴런을 가진 층으로, 압축이 일어남
- 일반적으로 특성맵 개수보다 16배 적어, 256개의 숫자가 작은 벡터로 압축됨
- 이 저차원 벡터(하나의 임베딩)는 특성 응답의 분포를 표현함
- SE 블록이 특성 조합에 대한 일반적인 표현을 학습하게됨
=> Squeeze
- 시그모이드 활성화 함수를 사용하는 밀집 출력 층
- 이전 층에서의 임베딩을 받아 특성 맵마다 (시그모이드를 통해)0~1 사이의 하나의 숫자를 담은 보정된 벡터를 출력
- 그 다음 특성 맵과 이 보정된 벡터를 곱해 관련 없는 특성값을 낮추고 관련 있는 특성값은 그대로 유지 -> 즉 채널들의 중요도에 따라 scaling
- => Excitation
=>global한 공간정보들을 압축해서 담고있는 channel wise 특성 맵으로부터 오로지 채널 간의 dependency를 끄집어 내는 Excitation 과정을 거쳐 채널들의 중요도에 따라 특성값들을 scaling해줌
(이 과정에서 관련없는 특성값을 낮춤으로써 성능향상을 이룰 수 있었음)
참고
SENet
sike6054.github.io/blog/paper/seventh-post/
Inception
Xception
sike6054.github.io/blog/paper/fifth-post/
LeNet-5
my-coding-footprints.tistory.com/97
[AI/Hands-on ML] - [핸즈온 머신러닝] 14장(3) -케라스를 통한 CNN 구현 및 모델 사용
'AI > Hands-on ML' 카테고리의 다른 글
[핸즈온 머신러닝] 14장(4) - CNN을 통한 위치 추정, 객체 탐지, 시맨틱 분할 (1) | 2021.04.06 |
---|---|
[핸즈온 머신러닝] 14장(3) -케라스를 통한 CNN 구현 및 모델 사용 (0) | 2021.04.03 |
[핸즈온 머신러닝] 14장(1) - 합성곱 신경망을 사용한 컴퓨터 비전 (0) | 2021.03.21 |
[핸즈온 머신러닝] 10장 - 케라스를 사용한 인공 신경망 3 (하이퍼파라미터 튜닝) (0) | 2021.03.07 |
[핸즈온 머신러닝] 10장 - 케라스를 사용한 인공 신경망 2 (케라스로 딥러닝하기) (0) | 2021.03.06 |