이번 챕터는 합성곱 신경망에 대해서 알아보려고 한다.
합성곱
합성곱은 입력 데이터에 도장을 찍는 것과 비슷하다고 보면 된다.
본래의 인공 신경망을 생각해보면, 가중치와 절편을 랜덤하게 초기화한 다음에, 에포크를 반복하면서 경사 하강법 알고리즘을 사용하여 손실이 낮아지도록 최적의 가중치와 절편을 찾는다.
하지만 합성곱은 밀집층 계산과는 다르게 입력 데이터 전체에 가중치를 적용하는 것이 아니라 일부에 가중치를 곱한다.
3개의 가중치와 가장 처음 3개 특성와 곱해져서 1개의 출력이 만들어진다.
그 다음 한칸을 이동해서 가중치를 곱하고 1개의 출력을 얻는다.
이런 방식을 취하는 것이 합성곱이다.
이렇게 한다면 총 8개의 출력이 나타난다.
밀집층의 뉴런은 10개의 가중치를 가지고 1개의 출력을 만든다면, 합성곱의 뉴런은 3개의 가중치를 가지고 8개의 출력을 만든다.
그리고 이 가중치 개수는 하이퍼파라미터다.
합성곱 신경망에서는 뉴런을 필터라고 부르거나 커널이라고 부른다.
합성곱의 장점은 1차원이 아니라 2차원 입력에도 적용할 수 있다는 것이 장점이다.
2차원 배열일 경우 방식은 다음과 같다.
먼저 좌측 상단에 맞춰서 첫번째 계산을 시행한다. 그다음 옆으로 한칸 이동하여 두번째 계산을 한다.
좌측 하단으로 가서 계산을 계속 진행한다. 여기서는 4*4 입력값에 3*3 크기의 커널을 적용하여 2*2의 출력값을 얻었다.
이때, 합성곱 계산을 통해서 얻은 출력을 특성 맵이라고 부른다.
합성곱도 여러개의 필터를 사용한다.
3개의 필터마다 각각 출력값이 생긴다.
(2,2)의 특성 맵을 쌓으면 3차원 배열이 생기는데 이때 출력값은 (2, 2, 3)의 3차원 배열이 된다.
케라스 합성곱 층
합성곱 층은 Conv2D 클래스로 제공이 된다.
from tensorflow import keras
keras.layers.Conv2D(10, kernel_size=(3, 3), activation='relu')
첫 번째 매개변수에는 필터의 개수를 지정한다. 여기서는 10이 필터의 개수일 것이다.
kernel_size에는 커널의 크기를 지정한다. 여기서는 (3, 3)의 배열이다.
activation에는 활성 함수를 지정해준다.
일반적으로 1개 이상의 합성곱 층을 쓴 인공 신경망을 합성곱 신경망이라고 부른다.
패딩과 스트라이드
패딩은 출력의 크기를 입력의 크기와 동일하게 만들기 위해서 입력의 크기를 임의로 늘리는 것이라 생각하면 된다.
예를 들면 다음과 같다.
4 * 4의 입력 층에 대해 3*3의 커널을 적용하면, 2*2의 출력층이 나온다.
이때, 출력층의 크기도 4 * 4로 맞추기 위해서 입력 배열 주위에 가상의 원소인 0을 채워 6 * 6 의 입력층을 만들어준다.
패딩을 하게 되면 주위의 값은 무조건 0으로 채우기 때문에 계산에 영향을 미치지는 않는다.
0으로 채우는 패딩을 특히 세임 패딩이라고 하고, 그냥 순수한 입력 층에 대해서만 합성곱을 해서 특성 맵을 만드는 경우
는 밸리드 패딩이라고 한다.
패딩을 하는 이유는 간단하다. 어느 특정 원소가 합성곱에 여러번 참여하여 참여 비율 차이를 줄이기 위해서이다.
keras.layers.Conv2D(10, kernel_size=(3,3), activation='relu', padding='same')
padding 매개변수로 패딩을 지정할 수 있는데, 기본 값은 valid로 밸리드 패딩이며, 세임 패딩을 사용하려면 same으로
지정해준다.
스트라이드는 커널이 이동하는 크기이다. 기본으로 1이 설정 되어있다.
keras.layers.Conv2D(10, kernel_size=(3,3), activation='relu', padding='same', strides=1)
오른쪽과 아래로 이동하는 크기를 각각 다르게 지정할 수 있으나, 이 경우는 대부분 없다.
풀링
풀링은 합성곱 층에서 만든 특성 맵의 크기를 줄이는 역할을 수행한다.
이 그림에서는 4*4 특성맵을 2*2 값으로 풀링을 한다. 풀링에는 가중치가 없고, 최대값 혹은 평균값을 고르는데
이를 각각 최대 풀링과 평균 풀링이라고 한다.
풀링은 기본적으로 스트라이드 크기와 풀링의 크기가 같다. 그리고 패딩도 없다.
keras.layers.MaxPooling2D(2)
MaxPooling2D의 첫 번째 매개변수로 풀링의 크기를 지정한다.
풀링의 크기를 다르게 하려면 튜플로 지정할 수 있으나, 이런 경우는 극히 드물다.
풀링은 가로세로 방향으로만 진행한다.
이 풀링을 사용하는 이유는 합성곱에서 스트라이드를 크게하여 특성 맵을 줄이는 것보다 풀링 층에서 크기를
줄이는 것이 경험적으로 더 나은 성능을 내기 때문이다.
합성곱 신경망의 구조를 표현하면 다음과 같이 나타낼 수 있다.
컬러 이미지를 이용한 합성곱
컬러 이미지는 RGB 채널로 구성되어 있어서, 컴퓨터는 이를 3차원 배열로 표시하게 된다.
즉, 너비와 높이에 깊이 까지 더해진 형태이다.
3차원 입력값이 입력된다면, 커널의 차원도 3차원으로 바뀐다.
동일한 것은, 이 입력층에 커널을 적용하면 출력은 하나만 나온다는 것이다.
필터가 10개인 경우에 어떻게 적용되는지 그림과 함께 마무리하겠다.
'Study > 혼자 공부하는 머신러닝' 카테고리의 다른 글
혼자 공부하는 머신러닝 + 딥러닝 - 합성곱 신경망의 시각화 (0) | 2022.04.27 |
---|---|
혼자 공부하는 머신러닝 + 딥러닝 - 합성곱 신경망을 사용한 이미지 분류 (0) | 2022.04.27 |
혼자 공부하는 머신러닝 + 딥러닝 - 신경망 모델 훈련 (0) | 2022.04.21 |
혼자 공부하는 머신러닝 + 딥러닝 - 심층 신경망 (0) | 2022.04.21 |
혼자 공부하는 머신러닝 - 인공 신경망 (0) | 2022.04.07 |