3.1 다중 퍼셉트론을 이용한 이미지 분류
MLP구조는 뉴런이 층 모양으로 모여있고, 인접한 층 사이의 모든 뉴런이 가중치가 있는 연결을 갖는다.
이러한 구조는 하나의 입력 층과, 하나 또는 그 이상의 은닉층, 하나의 출력층으로 구성된다.
해당 자에서는 MNIST 데이터셋을 대상으로 이미지 분류 문제를 풀어볼 것이다.
3.1.1 입력층
신경망으로 이미지를 다루기 위해선 신경망이 이해할 수 있는 형태로 데이터를 변환해야 한다.
MLP는 모양이 (1, n)인 1차원 벡터만 입력받으므로 2차원 이미지 행렬은 입력할 수 없다.
따라서, 행렬을 해당 모양의 벡터로 변환해야 한다. 이러한 과정을 이미지 벡터 변환이라고 한다. (image flattering)
예를 들어 28*28 크기의 이미지를 MLP의 입력으로 사용하기 위해선 1*784 크기의 벡터로 변환해야 한다.
케라스에서 제공하는 Flatten 층이 바로 위해서 말한 벡터 변환 역할을 수행합니다.
from keras.models import Sequential # 케라스 라이브러리 임포트
from keras.layers import Flatten # 이미지 행렬을 벡터로 변환하는 Flatten 층 임포트
model = Sequential() # 모델 정의
model.add(Flatten(input_shape = (28, 28))) # Flatten 층을 입력층으로 모델에 추가한다.
해당 클래스는 2차원 이미지 행렬을 입력받아 1차원 벡터로 변환합니다.
주의할 점은 Flatten 층을 만들 때 입력 이미지의 크기를 반드시 파라미터로 지정해야 합니다
3.1.2 은닉층
은닉층의 각 층은 하나 이상의 뉴런으로 구성된다.
예제에는 512개를 가진 은닉층을 두 개 만들고, 이때 각 층마다 ReLU 활성화 함수를 추가한다.
(은닉층에 한해서 대부분의 경우 ReLU 함수가 가장 성능이 좋다. 또한, 분류 문제이고 클래스가 중복되지 않는다면 출력층에 소프트맥스 함수를 사용하는 것이 가장 좋다.)
2개의 전결합층(dense layer, 밀집층)을 모델에 추가한다.
from keras.layes import Dense # Dense 층 임포트
model.add(Dense(512, activation = 'relu'))
model.add(Dense(512, activation = 'relu')) # 2개의 Dense 층을 모델에 추가
3.1.3 출력층
분류 문제의 출력층 노드 수는 분류 대상 클래스 수와 같다.
해당 문제에서는 0~9까지 숫자 10개가 분류 대상이므로 노드 10개를 갖는 Dense 층을 추가하면 된다.
model.add(Dense(10, activation = 'softmax'))
3.1.4 모델 완성하기
추가한 층을 모두 합치면 MLP 신경망이 완성된다.
model.summary() # 모델 구조를 간략하게 출력
Flatten 층의 출력을 보면 Param # 필드는 해당 층의 파라미터(가중치) 수를 의미한다. 학습은 이들 가중치가 조정되는 과정이며, 가중치의 수는 다음과 같이 계산된다.
1) Flatten_1은 행렬을 벡터로 변환하기만 하므로 Param 0
2) dense_1 층과 dense_2 층을 잇는 파라미터 수는 784*512 + 512 = 401,920개이다. 784는 입력층, 512는 dense_1 층의 노드 수, 512는 편향 수다.
3) dense_2 층과 dense_3 층을 잇는 파라미터 수는 512*512 + 512 = 262,656개이다. 512는 dense_1, 512는 dense_2 층의 노드 수, 512는 편향 수다.
4) dense_3 층과 출력층을 잇는 파라미터 수는 512*10 + 10 = 5,130개이다.
이와 같이 모든 층을 연결해 주는 파라미터를 손실 함숫값이 최소가 되도록 학습해야 한다.
여기서 알 수 있는 것처럼 층의 수나, 노드의 수, 이미지의 크기를 키우면 해당 파라미터의 개수가 급격히 늘어날 것을 예상할 수 있다. 이 점이 바로 MLP의 두 가지 주요 단점 중 하나이다.
3.1.5 MLP로 이미지를 다룰 때의 단점
CNN은 MLP의 두 가지 단점을 개선하기 위해 고안된 구조이다.
두 가지 단점은 다음과 간다.
1) 공간적 특징의 손실
2차원 이미지를 1차원 벡터로 변형하면 이미지 내 공간적 특징이 손실된다.
2차원 이미지를 이렇게 다루면 신경망이 서로 가까이 위치한 픽셀 간의 관계를 알 수 없기 때문에 정보의 손실이 생긴다.
이 와달리 CNN은 2차원 이미지를 그대로 입력할 수 있고, 멀리 떨어진 픽셀보다 서로 가까운 픽셀끼리 관계가 깊다는 것을 이해할 수 있다.
예를 들어 MLP 신경망이 고양의의 특징을 나타내는 모든 형태를 이미지 내 위치와 상관없이 학습해야 한다면, 이러한 학습은 신경망이 이미지를 구성하는 픽셀 간의 관계를 알 수 있어야 가능하다.
2) 전결합층
MLP는 전결합층으로 구성된다. 전결합이란 이전 층의 모든 노드가 다음 층의 모든 노드와 연결된다는 뜻이다.
입력 데이터의 크기가 작을 땐 큰 문제가 되진 않지만, 크기가 커지면 문제가 발생합니다.
1000*1000 크기의 이미지를 다룬다면 첫 번째 은닉층의 각 노드마다 백만 개의 파라미터를 갖게 됩니다. 이렇게 됐을 때 단 1개의 층만으로도 10억 개의 파라미터를 가진 신경망 학습을 해야 합니다.
이와 달리 CNN은 지역적으로 연결된 구조의 층을 갖습니다. 좀 더 구체적으로 설명하면 CNN은 이전 층의 노드 중 일부하고만 연결됩니다.
3) 합성곱 신경망 구조의 의의
2차원 구조의 정보를 잃어버리지 않고 픽셀값에 숨어 있는 패턴을 이해할 수 있으며, 지역 연결을 통해 처리해야 할 부하를 줄일 수 있습니다.
3.2 합성곱 신경망 구조
합성곱 신경망 역시 일반적인 신경망의 학습 과정과 크게 다르지 않습니다.
입력을 만들고 은닉층을 쌓아 신경망을 구성하며, 가중치는 무작위로 초기화되고, 활성화 함수를 사용합니다.
이후 오차를 계산해 해당 오차를 역전팡하여 가중치를 수정해 가는 학습 과정은 동일합니다.
차이점은 전결합층 대신 합성곱층을 사용해서 특징을 학습한다는 것입니다.
3.2.1 전체 학습 과정
1장에서 배웠던 전체 학습 과정을 돌아보겠습니다.
1. 데이터 입력 -> 2. 전처리 -> 3. 특징 추출 -> 4. 머신러닝 모델
3, 4 단계를 동시에 할 수 있는 신경망의 힘 덕분에 사람의 노력이 덜 들어가게 됐습니다.
이전의 MLP의 전결합층 문제는 분류보다 특징 학승 단계에서 문제가 있습니다. 따라서 해당 부분만 고치면 문제가 해결될 수 있습니다.
전결합층이 특징 추출(3단계)에서 제 역할을 다하지 못한다면 해당 부분을 합성곱층에 맡기면 됩니다.
반대로 전결합층은 일단 추출된 특징은 잘 분류(4단계)합니다. 해당 역할은 그대로 전결합층에 맡깁니다.
CNN의 추상적인 구조는 다음과 같습니다..
해당 구조의 세부 내용은 차차 설명하겠습니다.
구조의 단계는 다음과 같습니다.
1) 이미지를 합성곱층에 입력한다.
2) 이미지가 합성곱층을 지나며 발견된 패턴이 특징 맵으로 추출된다. 합성곱의 출력은 1차원 특징 벡터로 변환된다. 이때 특징 추출이 끝날 때까지 이미지의 크기가 각 층을 지나면서 줄어든다. 특징 맵 수는 깊어진다. 이러한 부분은 원래 이미지를 잘 나타내는 추상적인 특징을 학습하는 별도의 신경망이라고 볼 수 있다.
3) 1차원으로 변환된 특징 벡터는 이어지는 전결합층에 입력되어 이미지를 분류한다.
3) 예측 결과에 해당하는 출력층의 노드가 발화한다.
신경망의 기본적인 발상은 뉴런이 입력으로부터 특징을 학습한다는 것입니다.
CNN의 특징 맵은 이전 층에서 적용된 필터의 출력입니다. 특징 맵이라는 이름이 붙은 이유는 해당 특징이 이미지의 어느 부분에서 발견되었는지 나타내기 때문입니다.
CNN은 이미지에서 특정 물체를 탐지하고, 이러한 결과를 특징 맵에 포함시킵니다.
3.2.2 특징 추출 과정 들여다보기
해당 과정은 큰 이미지를 여러 개의 작은 특징 맵으로 나눈 뒤 이를 쌓아 벡터로 만드는 과정입니다.
예를 들어 '감'이라는 글자를 학습한다고 하겠습니다.
특징 추출 과정은 'ㄱ', 'ㅏ', 'ㅁ'과 같이 특징의 위치가 담긴 여러 개의 이미지로 조각조각 나누어집니다.
이러한 결과로 이미지의 크기는 작아지고, 특징의 가짓수가 늘어나므로 깊이도 점점 깊어집니다.
실제로는 다른 사물이 찍힌 이미지와 구분되는 의미 있는 특징을 추출해서 다른 특징과 함께 쌓아둡니다.
3.2.3 분류 과정 들여다보기
특징 추출이 끝난 뒤에는 전결합층(일반적인 MLP)을 추가해서 특징 벡터를 입력받도록 합니다.
아래에서 더 자세히 알아보겠습니다. (3.3.3)
3.3 합성곱 신경망의 기본 요소
대부분의 합성곱 신경망에는 다음 세 가지 유형의 층이 있습니다.
1) 합성곱층 convolutioanl layer, CONV
2) 풀링층 polling layer, POOL
3) 전결합층 fully connectied layer, FC
3.3.1 합성곱층
합성곱층은 합성곱 신경망의 핵심 구성 요소입니다. 이미지 위를 픽셀 단위로 오가며 특징을 찾는 확대경과 같은 역할을 하며 이미지에 찍힌 사물을 구분 짓는 특징을 추출합니다.
1) 합성곱이란
수학에서 말하는 합성곱은 두 함수를 인수로 새로운 함수를 만드는 연삽입니다.
합성곱 신경망에서 첫 번째 인수는 입력 이미지, 두 번째 인수는 합성곱 필터에 해당합니다.
합성곱 필터를 커널이라고 부르기도 합니다. 커널은 입력 이미지 위로 픽셀 단위로 움직이며 연산을 수행하며, 해당 연산 결과를 모아 새로운 이미지를 만들어 다음 층에 전달합니다.
필터가 위치한 이미지상의 범위를 수용 영역(Receptive field)라고 합니다.
커널은 합성곱 신경망에서 가중치를 의미합니다. 따라서 합성곱 행렬은 무작위 값으로 초기화되며 신경망에 의해 학습되는 값입니다.
2) 합성곱 연산
수용 역역에 들어온 각 픽셀값을 자신과 겹쳐진 합성곱 필터의 픽셀값과 곱하고, 그 결과를 합해 새로운 이미지의 픽셀값 하나를 결정합니다. 이러한 과정은 행렬의 점곱과 같습니다.
합성곱 필터가 한 번 움직일 때마다 픽셀 단위로 가중합이 계산되어 필터 중심에 해당하는 픽셀의 새로운 값이 결정된다.
이러한 방법을 만들어진 이미지를 특징 맵 또는 활성화 맵이라고 합니다.
3) 합성곱층 전체 구조
합성곱층에는 하나 또는 그 이상의 합성곱 필터가 있습니다.
이전 합성곱층의 합성곱 필터 수만큼 특징 맵(합성곱 연산으로 생성된 이미지)이 출력되기 때문에 해당 필터 수가 다음 층의 깊이를 결정합니다.
from keras.layers import Conv2D
model.add(Conv2D(filters=16, kernel_size=2, strides='1', padding='same', activation='relu'))
해당 코드로 합성곱층 구현이 끝납니다. 전체 코드는 마지막에 서술하겠습니다.
코드에서 알 수 있듯이 합성곱층에는 5개의 인수가 있습니다.
앞에서 설명했다시피 은닉층의 활성화 함수는 ReLU를 사용하는 것이 좋습니다. 나머지 인수들은 다음과 같습니다.
- filters: 합성곱 필터 수. 출력의 깊이를 결정한다.
- kernel_size: 합성곱 필터 행렬의 크기. 2*2, 3*3, 5*5 이렇게 세 가지가 있다.
stride와 padding은 다음 절에서 설명하겠습니다.
4) 합성곱 필터 수
합성곱층에는 하나 이상의 합성곱 필터가 있습니다. 이를 이해하기 위해 MLP를 떠올려보겠습니다.
신경망의 은닉층은 뉴런 n개(은닉층 유닛)로 구성됩니다.
마찬가지로 합성곱층은 CNN의 은닉층이라고 할 수 있습니다. 커널의 유닛 하나가 뉴런과 같다고 보면 됩니다.
예를 들어 3*3 크기의 커널은 뉴런 9개와 같습니다.
5) 커널 크기
합성곱 필터를 커널이라고도 합니다. 커널은 가중치가 담긴 행렬로, 입력 이미지 위를 이동하며 특징을 추출합니다.
커널 크기는 합성곱 필터 크기를 의미합니다.
커널 크기는 합성곱층을 만들기 위해 필요한 하이퍼파라미터 중 하나입니다.
직관적으로 필터 크기가 작을수록 이미지의 세세한 부분까지 잡을 수 있습니다.
합성곱 필터에는 신경망 학습 대상이 되는 가중치가 들어있습니다. 따라서 이론적으로 커널 크기가 클수록 신경망이 복잡한 패턴을 학습할 수 있습니다.
커널은 대부분 정사각형이며 최소 2*2, 최대 5*5 크기의 필터가 사용됩니다.
6) 스트라이드와 패딩
이 두 하퍼파라미터는 합성곱층의 출력 모양을 결정합니다.
- 스트라이드(stride)
: 필터가 입력 이미지 위를 한 번에 이동하는 픽셀 수. 3 이상의 스트라이드 값은 잘 사용하지 않는다.
스트라이드가 1이면 입력 이미지와 거의 같은 크기의 출력 이미지를 얻을 수 있다. 거의라는 의미는 패딩 설정에 따라 크기가 또 바뀌기 때문이다. - 패딩(padding)
: 흔히 말하는 제로패딩은 이미지 둘레에 픽셀값이 0인 추가 픽셀을 덧붙이는 것을 말한다.
패딩의 주된 목적은 합성곱 연산을 거친 출력 이미지의 크기를 입력과 같게 유지하는 것이다. 이미지 크기를 유지하면 합성곱층을 여러 개 사용 할 수 있다.
3.3.2 풀링층과 서브샘플링
신경망의 규모가 커지면서 학습에 필요한 계산 복잡도가 상승되는 문제를 해결해 주는 것이 풀링층입니다.
풀링은 다음 층을 전달되는 파라미터 수를 감소시켜 신경망의 크기를 줄입니다.
풀링 연산은 최대 또는 평균과 같은 통계 함수로 입력 크기를 축소해 다음 층으로 전달되는 파라미터 수를 감소시킵니다.
=> 다운샘플링
풀링층은 합성곱층 사이에 배치하며 하나 걸러 배치할 때도 있습니다.
1) 최대 풀링과 평균 풀링
- 최대 풀링
: 최대 풀링 커널에도 윈도우 크기와 스트라이드가 있습니다. 하지만 행렬에 별다른 가중치가 없다는 것이 다릅니다.
최대 풀링층은 자기 앞의 합성곱층에서 출력한 특징 맵을 입력받아 앞선 합성곱 필터와 같이 동작하며 윈도우 내의 픽셀값 중 최댓값을 찾아 이를 출력 이미지의 픽셀값으로 선정합니다.
합성곱층이 출력한 모든 특징 맵에 풀링을 적용하면 특징 맵의 크기는 작아지지만, 개수는 유지됩니다.
(합성곱층 4*4*3 => 풀링층 2*2*3) - 전역 평균 풀링
: 특징 맵의 크기를 극단적으로 줄이는 방식입니다. 윈도우 크기와 스트라이드를 정하지 않고 전체 특징 맵 픽셀값의 평균을 구합니다.
(합성곱층 4*4*3 => 풀링층 1*1*3)
2) 풀링층을 사용하는 이유
풀링층을 사용하면 중요한 특징을 잃지 않으면서 이미지 크기를 줄여 다음 층에 전달할 수 있습니다.
일종의 이미지 압축 프로그램이라고 생각하면 이해하기 쉽습니다.
중요한 특징은 유지하면서 이지미의 해상도를 떨어뜨리는 특성을 가집니다.
일반적으로 풀링층을 사용하지만, 무용론도 있습니다.
특히 최근 주목받고 있는 생성적 적대 신경망에서는 풀링층을 배제하는 방법이 효과적이긴 합니다.
풀링층은 다음과 같이 설정할 수 있습니다.
from keras.layers import MaxPooling2D
model.add(MaxPooling2D(pool_size = (2,2), strides = 2))
신경망의 깊이를 원하는 만큼 유지할 수 있도록 위의 합성곱층(3.3.1 (3))과 풀링층을 번갈아가면서 배치합니다.
3.3.3 전결합층
합성곱층과 풀링층으로 구성된 학습 과정을 거치면 대롱과 같은 모양으로 추출된 특징을 얻을 수 있습니다.
이러한 특징을 사용해서 실제 이미지를 분류하기 위해서 MLP 신경망 구조를 사용합니다.
1) 전결합층을 사용하는 이유
MLP는 분류에 효과적입니다. MLP(전결합층)은 다음과 같습니다.
- 1차원 벡터 입력
: 대롱 형태로 추출된 특징 맵을 MLP에 입력하기 위해 1차원 벡터로 변환한다. - 은닉층
: 하나 이상의 전결합층을 갖고, 전결합층은 하나 이상의 뉴런으로 구성된다. - 출력층
: 분류 문제를 위한 출력층의 활성화 함수는 소프트맥스 함수를 사용한다.
3.4 CNN을 이용한 이미지 분류 방법
이제 이미지를 분류하기 위한 CNN 모델을 만들 준비가 다 되었습니다. 이번에도 MNIST 데이터셋은 동일합니다.
어떤 딥러닝 라이브러리를 사용하더라도 개념은 거의 동일합니다. 먼저 머릿속이나 종이 위에 층을 추가하며 구조를 설계하고, 각 층의 파라미터를 설정합니다.
3.4.1 모델 구조 구성하기
CNN 모델의 구조를 정의하고 구성하는 부분입니다.
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
model = Sequential() # 모델 객체 생성
# CONV_1: add CONV layer with RELU activation and depth = 32 kernels
model.add(Conv2D(32, kernel_size=(3, 3), padding='same',activation='relu',input_shape=(28,28,1)))
# ReLU를 활성화 함수로 사영하며 커널 수가 32인 합성곱층을 모델에 추가.
# POOL_1: downsample the image to choose the best features
model.add(MaxPooling2D(pool_size=(2, 2)))
#좋은 특징을 얻기 위해 이미지를 다운샘플링
# CONV_2: here we increase the depth to 64
model.add(Conv2D(64, (3, 3),padding='same', activation='relu'))
# 커널 수를 64로 증가시킨 합성곱층
# POOL_2: more downsampling
model.add(MaxPooling2D(pool_size=(2, 2)))
# 다시 한번 이미지를 다운샘플링
# flatten since too many dimensions, we only want a classification output
model.add(Flatten())
# 분률를 위해 추출된 특징을 1차원 벡터로 변환
# FC_1: fully connected to get all relevant data
model.add(Dense(64, activation='relu'))
# 변환된 특징 벡터를 입력받는 전결합층
# FC_2: output a softmax to squash the matrix into output probabilities for the 10 classes
model.add(Dense(10, activation='softmax'))
# 소프트맥스 함수로 클래스 10개의 확률을 출력하는 전결합층
model.summary()
구축된 모델은 다음과 같습니다.
- input_shape 인수는 첫 번째 합성곱층에만 지정한다.
- 모든 합성곱층과 풀링층의 출력은 모양이 (None, height, width, channels)인 3차원 텐서다.
channels는 출력 이미지의 깊이, 다시 말해 특징 맵 수를 의미한다.
None은 해당 층에서 처리된 이미지 수다. 따라서 이 값이 None이면 batch_size를 자유롭게 정할 수 있다. - 출력된 모델의 개요에서 Output Shape 항목을 보면 앞서 설명한 내용처럼 신경망의 층이 거듭될수록 출력되는 이미지의 크기가 작아지는 것을 알 수 있다.
모델의 개요를 한 줄씩 자세히 살펴보겠습니다.
- CONV_1
입력은 모양이 28*28*이고 Conv2d의 출력 모양은 28*28*32다. 스트라이드와 패딩을 모두 1로 설정했기 때문에 출력 이미지와 입력 이미지가 같다. 깊이는 합성곱 필터가 32개이기 때문에 증가했다. 필터마다 특징 맵을 하나씩 출력 한다. - POOL_1
이 층의 입력은 이전 층의 출력과 모양이 같다. 풀링층을 거치고 나면 이지 크기가 줄어들지만 깊이는 그대로 유지된다. (특징 수가 유지!) 해당 층은 2*2 풀링을 적용하므로 14*14*32가 된다. - CONV_2
이 층 역시 합성곱층이므로 입력과 출력에서 이미지 크기가 같으며 깊이만 늘어난다. 필터가 64개이므로 14*14*64 - POOL_2
POOL_1과 같은 방식으로 7*7*64가 된다. - Flatten
특징 맵 방향으로 긴 대롱 형태로 추출된 특징을 모양이 1*3136인 1차원 벡터로 변환한다. - Dense_1
뉴런이 64개인 전결합층, 출력도 64개다. - Dense_2
분류 대상 클래스가 10개이므로 뉴런도 10개인 출력층이다.
3.4.2 파라미터(가중치 수)
위에서 살펴보지 않은 한 가지 중요한 정보가 남아있습니다.
모델 요약의 Param# 항목입니다.
1) 파라미터
파라미터는 가중치의 다른 이름입니다. 신경망의 학습 대상이기도 합니다.
신경망의 목표는 경사 하강법과 역전파 알고리즘을 통해 오차 함숫값이 최소가 되도록 가중치를 수정하는 것입니다.
2) 파라미터 수를 계산하는 방법
MLP는 인접한 층의 노드 수를 서로 곱하기만 하면 해당 층의 가중치 수를 계산할 수 있었습니다.
CNN의 가중치 수를 구하는 방법은 다음과 같습니다.
파라미터 수 = 필터 수 * 커널 크기 * 이전 층 출력의 깊이 + 필터 수 (편향)
# CONV_2: here we increase the depth to 64
model.add(Conv2D(64, (3, 3),padding='same', activation='relu'))
위의 코드를 보며 파라미터 수를 계산해보겠습니다.
파라미터 수 = 64 * 3* 3 * 32 + 64 = 18,496
풀링층과 Flatten 층에는 파라미터가 없습니다.
3) 학습 가능한 파라미터와 불가능한 파라미터
지금은 모든 파라미터가 학습 가능한 파라미터입니다.
이후 장에서는 빠르고 정확한 학습을 위해 사전 학습된 신경망과 새 층을 합쳐 새로운 신경망을 구성하는 방법을 알아볼 겁니다. 이런 경우에는 사전 학습된 층의 파라미터를 고정(동결)시켜야 하므로 학습 대상이 아닌 파라미터가 생깁니다.
3.5 과적합을 방지하기 위해 드롭아웃층 추가하기
합성곱층, 풀링층, 전결합층까지 세 가지의 층을 알아보았고, 과적합을 피하기 위해 추가하는 층을 알아보겠습니다.
3.5.1 과적합이란
모델이 데이터를 나타내기에 너무 단순한 경우에는 과소적합(underfitting)이라고 합니다.
반면, 과적합(overfitting)은 모델이 학습 데이터에 지나치게 부합하는 현상입니다.
이러한 경우에는 학습 데이터는 완전하게 부합하지만, 처음 보는 데이터는 잘 예측하지 못해 일반화 성능이 떨어지는 경우입니다.
3.5.2 드롭아웃층이란
드롭아웃을 적용하면 층을 구성하는 뉴런(노드)의 일정 비율을 비활성화합니다. 해당 비율은 신경망의 하이퍼 파라미터로 지정됩니다.
드롭아웃은 특정 노드가 다른 노드를 지배해 큰 실수를 일으키는 일을 방지하고 모든 노드가 동등하게 성능에 기여하는데 도움이 됩니다.
한마디로 신경망의 유연성을 확보하는 기법이라고 보면 되고, 모든 노드가 함께 협력해서 동작하며 영향력이 지나치게 약하거나 강한 노드가 생기는 것을 막는 것이다.
3.5.3 드롭아웃층이 필요한 이유
뉴런은 학습 과정을 거치며 상호 의존 관계를 구축합니다. 이는 과적합의 원인이 됩니다.
MLP에서 노드는 특징을 의미합니다. 해당 특징은 가중치가 곱해져 다음 노드로 변환됩니다.
이러한 노드 중 일부를 비활성화한다면 다른 노드들은 비활성화된 노드가 가진 특징 없이 패턴을 학습해야 합니다. 모든 특징이 이런 식으로 비활성화될 수 있으므로 가중치가 특징 간에 고르게 분산되는 효과가 발행하며 더 잘 학습된 뉴런으로 이어진다.
드롭아웃은 뉴런 간에 발생하는 상호 의존 관계도 완화시킬 수 있다.
이런 관점에서 드롭아웃을 일종의 앙상블 학습 기법으로 볼 수 있습니다. 앙상블 학습은 여러 개의 약분류기를 독립적으로 학습시킨 후 이들의 예측 결과를 통합해 전체 결과로 삼는 기법이다.
하나하나의 약분류기가 따로 학습되었기 때문에 데이터의 서로 다른 측면을 학습했고 실수도 각각 다릅니다.
이를 묶으면 과적합을 적게 일으키는 더 강력한 분류기를 만들 수 있습니다.
3.5.4 CNN 구조 중 어디에 드롭아웃층을 끼워 넣어야 할까
드롭아웃층은 추출된 특징의 1차원 벡터 변환이 끝난 다음부터 마지막 출력층 사이에 배치하는 것이 일반적입니다.
경험적으로 합성곱 신경망의 전결합층에 적용하는 것이 좋다고 알려져 있기 때문입니다.
# 합성곱층과 풀링층을 엇갈려 배치
model.add(Flatten())
model.add(Dropout(rate=0.3)) # 30%의 노드를 비활성화 하는 드롭아웃층
model.add(Dense(64, activation='relu')) # 데이터를 모두 입력받는 접결합층
model.add(Dropout(rate=0.5))
model.add(Dense(10, activation='softmax')) # 10개 클래스의 확률을 출력하도록 소프트맥스 함수를 활성화 함수로 사용
model.summary()
비활성화되는 노드는 새로운 에포크마다 바뀝니다.
3.6 컬러 이미지의 합성곱 연산(3D 이미지)
컴퓨터가 본 컬러이미지는 너비, 높이, 깊이를 가진 3차원 행렬의 형태입니다.
3.6.1 컬러 이미지를 대상으로 합성곱 연산하기
회색조 이미지와 마찬가지로 합성곱 커널을 입력 이미징 위로 이동시키며 특징 맵을 계산 하면 됩니다.
그러나 이제 커널도 채널이 추가되어 3차원이 됐습니다.
즉, 색상 채널별로 별도의 필터를 갖습니다. 이때 세 채널의 픽셀값을 모아 특징 맵의 픽셀값을 계산하는데, 편향값 1을 더하는 것을 잊으면 안 됩니다.
내용이 너무 길어져서 다음 게시물에 컬러 이미지 분류 문제 실습 내용을 정리하겠습니다.
'Study > Vision & Deep Learning' 카테고리의 다른 글
[VISION] 비전 시스템을 위한 딥러닝(7) - R-CNN, SSD, YOLO를 이용한 사물 탐지 (1) | 2023.05.31 |
---|---|
[VISION] 비전 시스템을 위한 딥러닝(6) - 전이학습 (0) | 2023.05.30 |
[VISION] 비전 시스템을 위한 딥러닝(4) - 프로젝트: 이미지 분류 정확도 개선하기 (0) | 2023.05.29 |
[VISION] 비전 시스템을 위한 딥러닝(3) - 딥러닝 프로젝트 시동걸기 (0) | 2023.05.29 |
[VISION] 비전 시스템을 위한 딥러닝(2) - 프로젝트: 컬러 이미지 분류 실습(CNN) (0) | 2023.05.29 |