CNN 구조
전형적인 CNN 구조는 합성곱 층을 몇 개 쌓고(각각 ReLU 층을 그 뒤에 놓고), 그 다음에 풀링 층을 쌓고, 그 다음에 또 합성곱 층을 몇 개 더 쌓고, 그 다음에 다시 풀링 층을 쌓는 식이다.
네트워크를 통과하여 진행할수록 이미지는 점점 작아지지만 합성곱 층 때문에 일반적으로 점점 더 깊어지며, 더 많은 특성 맵을 가진다.
지난 몇 년간 기본 구조에서 여러 변형이 개발되었고 인공 지능 분야의 놀라운 발전을 이끌었다.
얼마나 진전되는지 확인하는 방법은 ILSVRC 이미지넷 대회(http://image-net.org) 같은 경연 대회의 오류율을 보는 것이다.
대회에서 우승한 모델들의 발전 과정을 살펴보면 CNN의 작동 방식과 어떻게 딥러닝 연구가 발전되었는지 이해하는 데 많은 도움이 될 것이다.
LeNet-5
LeNet-5 구조는 아마도 가장 널리 알려진 CNN 구조일 것이다. 이 구조는 손글씨 숫자 인식에 널리 사용되었다.
이 모델은 합성곱 층과 풀링 층을 쌓고 밀집 층이 뒤따른다. 최신 분류 CNN과 가장 크게 차이나는 점은 활성화 함수일 것이다.
요즘에는 tanh 대신에 ReLU를 사용하고 RBF 대신에 소프트맥스를 사용한다.
[관련 사이트]
AlexNet
AlexNet CNN 구조는 2012년 이미지넷 대회에서 큰 차이로 우승했다. AlexNet은 알렉스 크리체프스키, 일리아 서스케버, 제프리 힌턴이 만들었다. 이 구조는 더 크고 깊을 뿐 LeNet-5와 비슷하며, 처음으로 합성곱 층 위에 풀링층을 쌓지 않고 바로 합성곱 층끼리 쌓았다.
이 모델은 과대적합을 줄이기 위해 훈련 이미지를 랜덤하게 여러 간격으로 이동하거나 수평으로 뒤집고 조명을 바꾸는 식으로 데이터 증식을 수행했다.
GoogLeNet
구글 리서치의 크리스티언 세게디 등이 개발한 GoogLeNet 구조는 ILSVRC 2014 대회에서 톱-5 오류율을 7% 이하로 낮췄다. 인셉션 모듈이라는 서브 네트워크를 가지고 있어서 GoogLeNet 이 이전의 구조보다 훨씬 효과적으로 파라미터를 사용한다. 실제로 GoogLeNet 은 AlexNet 보다 10배나 적은 파라미터를 가진다.
이후에 구글 연구자들은 Inception-v3와 Inception-v4를 포함해 여러 GoogLeNet 변형을 제안했다.
VGGNet
옥스퍼드 대학교 VGG 연구소의 캐런 시몬안과 앤드루 지서만이 개발한 모델이다. VGGNet은 매우 단순하고 고전적인 구조이다. 2개 또는 3개의 합성곱 층 뒤에 풀링 층이 나오고 다시 2개 또는 3개의 합성곱 층과 풀링 층이 등장하는 식이다. (종류에 따라 총 16개 또는 19개의 합성곱 층이 있다)
마지막 밀집 네트워크는 2개의 은닉 층과 출력 층으로 이루어진다. VGGNet은 많은 개수의 필터를 사용하지만 3 x 3 필터만 사용한다.
ResNet
카이밍 허 등은 잔차 네트워크를 사용해 ILSVRC 2015 대회에서 우승했다. 우승한 네트워크는 152개 층으로 구성된 극도로 깊은 CNN을 사용했다. 또한 더 적은 파라미터를 사용해 점점 더 깊은 네트워크로 컴퓨터 비전 모델을 구성하는 일반적인 트렌드를 만들었다. 이런 깊은 네트워크를 훈련시킬 수 있는 핵심요소는 스킵 연결(또는 숏컷 연결) 이다. 즉, 어떤 층에 주입되는 신호가 상위 층의 출력에도 더해진다.
이 구조는 놀라울 정도로 매우 단순하고, 드롭아웃 층을 제외하고는 GoogLeNet과 똑같이 시작하고 종료한다. 다만 중간에 단순한 잔차 유닛을 매우 깊게 쌓은 것일 뿐이다. 각 잔차 유닛은 배치 정규화(BN)와 ReLU, 3X3 커널을 사용하고 공간 정보를 유지하는 스트라이드 1, "same" 패딩 두 개의 합성곱 층으로 이루어져 있고, 풀링 층은 없다.
특성 맵의 수는 몇 개의 잔차 유닛마다 두 배로 늘어나고 높이와 너비는 절반이 된다. 이러한 경우 입력과 출력의 크기가 다르기 때문에 입력이 잔차 유닛의 출력에 바로 더해질 수 없다.
이 문제를 해결하기 위해 스트라이드 2이고 출력 특성 맵의 수가 같은 1x1 합성곱 층으로 입력을 통과시킨다.
Xception
케라스의 창시자인 프랑수아 솔레가 2016년에 제안한 GoogLeNet의 또 다른 변형 모델이다.
3억 5천만 개의 이미지와 17,000 클래스를 가진 대규모 비전 문제에서 Inception-v3보다 훨씬 성능이 뛰어나다.
SENet
이 구조는 인셉션 네트워크와 ResNet 같은 기존 구조를 확장하여 성능을 높였다. 이 구조는 원래 구조에 있는 모든 인셉션 모듈이나 모든 잔차 유닛에 SE 블록이라는 작은 신경망을 추가하여 성능을 향상했다.
SE 블록이 추가된 부분의 유닛의 출력을 깊이 차원에 초점을 맞춰 분석한다. 어떤 특성이 일반적으로 동시에 가장 크게 활성화되는지 학습한 다음, 이 정보를 사용하여 특성 맵을 보정한다. 예를들어 우리가 사진에서 입과 코를 보았다면 눈도 볼 수 있다고 기대하여 입과 코 특성 맵이 강하게 활성되고 눈 특성 맵만 크게 활성화되지 않았다면 이 블록이 눈 특성 맵의 출력을 높인다. 눈이 다른 요소와 다소 혼동된다면 이런 특성 맵 보정이 애매함을 해결하는 데 도움이 될 것이다.
하나의 SE 블록은 3개의 층으로 구성된다. 전역 평균 풀링 층과 ReLU 활성화 함수를 사용하는 밀집 은닉 층, 시그모이드 함수를 사용하는 밀집 출력 층이다.
그 외의 다른 구조들
◆ ResNeXt
이 모델은 ResNet의 잔차 유닛을 향상시켰다. 최상의 ResNet 모델에 있는 잔차 유닛이 각각 3개의 합성곱 층을 가지고 있지만 이 모델의 잔차 유닛은 3개의 합성곱 층을 가진 여러 병렬 스택으로 구성된다. 하지만 각 스택의 처음 2개의 층은 적은 수의 필터만 사용하기 때문에 전체적인 파라미터 개수는 ResNet 과 동일하다. 그다음 모든 스택의 출력이 합쳐져 다음 잔차 유닛으로 전달된다.
◆ DenseNet
이 모델은 여러 개의 밀집 블록으로 구성되어 있다. 각 블록은 몇 개의 밀집 연결 합성곱 층으로 만들어진다. 이 구조는 비교적 적은 수의 파라미터를 사용하지만 뛰어난 정확도를 달성했다.
여기서 '밀집 연결'은 각 층의 출력이 동일 블록 안에서 그 다음에 나오는 다른 모든 층의 입력으로 전달되는 것을 의미한다. 밀집 블록은 몇개의 전환 층으로 분리된다.
◆ MobileNet
이 구조는 경량이고 빠르게 설계된 간소화 모델로 모바일과 웹 애플리케이션에서 널리 사용된다. Xception 처럼 깊이별 분리 합성곱 층을 기반으로 한다. 저자들은 약간의 정확도를 희생하면서 더 빠르고 작으 ㄴ모델을 위해 여러 변형 모델을 제안했다.
◆ CSPNet
이 구조는 DenseNet과 비슷하지만 각 밀집 블록의 입력 중 일부가 블록을 통과하지 않고 블록의 출력에 바로 연결된다.
◆ EfficientNet
이 모델은 앞서 나열한 것들 중에서 가장 중요한 모델이다. 이 구조를 만든 이들은 복합 스케일링을 제안했다. 복합 스케일링이란, 원칙에 입각하여 깊이(층 개수), 너비(층의 필터 개수), 해상도(입력 이미지 크기)를 동시에 증가시켜 어떤 CNN이라도 효율적으로 확장할 수 있는 방법을 말한다.
신경망 구조 검색을 사용해 축소된 버전의 이미지넷에서 좋은 성능을 내는 구조를 찾는다. 그다음 복합 스케일링을 사용해 이 구조의 더 큰 버전을 만든다. EfficientNet이 등장했을 때 모든 컴퓨팅 비용 측면에서 기존의 모델을 크게 능가했다.
올바른 CNN 구조 선택
무엇을 가장 중요하게 여기는 지에 따라 프로젝트에 가장 잘 맞는 구조를 선택한다.
그 기준에는
- 정확도
- 모델 크기
- CPU의 추론 속도
- GPU에서 추론 속도
아래의 표는 케라스에서 제공하는 사전 훈련된 최상의 모델을 모델 크기순으로 나열한 것이다.
클래스 이름 | 크기(MB) | 톱 정확도(%) | 파라미터 수(M) | CPU(ms) | GPU(ms) |
MobileNetV2 | 14 | 71.3 | 3.5 | 25.9 | 3.8 |
MobileNet | 16 | 70.4 | 4.3 | 22.6 | 4.7 |
NASNetMobile | 23 | 74.4 | 5.3 | 27.0 | 6.7 |
EfficientNetB0 | 29 | 77.1 | 5.3 | 46.0 | 4.9 |
EfficientNetB1 | 31 | 79.1 | 7.9 | 60.2 | 5.6 |
EfficientNetB2 | 36 | 80.1 | 9.2 | 80.8 | 6.5 |
EfficientNetB3 | 48 | 81.6 | 12.3 | 140.0 | 8.8 |
EfficientNetB0 | 75 | 82.9 | 19.5 | 308.3 | 15.1 |
InceptionV3 | 92 | 77.9 | 23.9 | 42.2 | 6.9 |
RestNet50V2 | 98 | 76.0 | 25.6 | 45.6 | 4.4 |
EfficientNetB5 | 118 | 83.6 | 30.6 | 579.2 | 25.3 |
EfficientNetB6 | 166 | 84.0 | 43.3 | 958.1 | 40.4 |
RestNet101V2 | 171 | 77.2 | 44.7 | 72.7 | 5.4 |
InceptionResNetV2 | 215 | 80.3 | 55.9 | 130.2 | 10.0 |
EfficientNetB7 | 256 | 84.3 | 66.7 | 1578.9 | 61.6 |
전체 목록은 하단 링크에서 확인
'[파이썬 Projects] > <파이썬 딥러닝, 신경망>' 카테고리의 다른 글
[머신러닝 프레임워크] Keras vs Tensorflow vs Pytorch (0) | 2024.09.09 |
---|---|
[텐서플로우 설치] X고생한 텐서플로우 import 성공기 (1) | 2024.09.07 |
[이미지 전처리] OpenCV를 통한 이미지 Resize 작업 (2) | 2024.09.06 |
[이미지 라벨링] LabelImg 설치 및 실행 하기 (2) | 2024.09.06 |
[머신러닝] 텐서플로우(TensorFlow)란? (0) | 2024.08.06 |