드디어 coputervision의 꽃 CNN을 학습할 시간입니다.
CNN을 이해하기 위해 지금까지 학습했다고 생각하셔도 됩니다.
처음엔 어렵게 느껴질 수 있겠지만 저도 공부하면서
최대한 자세히 정리해보도록 하겠습니다!!
마찬가지로 위키 독스와 모모딥 시즌1을 참고하여 정리해보도록 하겠습니다.
학습 목표
CNN에 대해 알아본다.
핵심 키워드
합성곱(Convolution)
패딩(Padding)
풀링(Pooling)
1. 합성곱 신경망(Convolution and Pooling)
CNN은 합성곱층(Convolution layers)과 풀링층(Pooling layers)으로 이루어진 신경망을 말합니다. 아래 사진을 보면 CONV는 합성곱 연산을, POOL은 풀링 연산을 의미합니다. 즉, 합성곱 연산관 풀링 연산이 어떻게 이루어지는지 알면 우리가 배우려고 하는 CNN을 이해할 수 있게 되는 것입니다. 이제 각 연산이 어떻게 이루어지는지 살펴보도록 하겠습니다.
2. 합성곱(Convolution)
우리가 이전에 학습한 다층 퍼셉트론은 XOR문제와 같이 하나의 층으로 해결할 수 없는 다양한 문제를 해결할 수 있었습니다. 하지만 이러한 다층 퍼셉트론은 입력이 들어왔을 때 이를 하나의 벡터로 변환하고 학습을 진행하기 때문에 공간적인 구조 정보를 저장하지 못합니다. 여기서 이야기하는 공간적인 구조 정보란 가까운 피셀들끼리 어떤 유사성을 가지는지, 어떤 필셀들은 어떤 비슷한 값을 가지는 등의 정보를 말합니다. 아래 사진을 보면 알 수 있듯이 하나의 벡터로 변환하게 되면 해당 픽셀이 사진상에서 어디에 위치하고 있었는지 판단하기가 매우 어렵습니다.
이러한 문제점으로 인해 이미지의 공간적인 구조 정보를 보존하면서 학습할 방법이 필요해졌고 이를 위해 바로 합성곱 신경망을 사용하는 것입니다. 합성곱층은 합성곱 연산을 통해 이미지의 특징을 추출합니다. 그럼 합성곱이 어떻게 이루어지는지 살펴보도록 하겠습니다.
합성곱 연산을 쉽게 이해하면 커널(kenel) 또는 필터(filter)라고 불리는 일반적으로 3X3, 5X5 행렬이 이미지를 상하좌우 모두 훑는다고 생각하면 됩니다.
위의 그림을 보면 알 수 있듯이 3X3의 필터가 4X4의 이미지를 한 칸씩 이동하며 필터의 각 원소와 대응하는 이미지의 원소와 곱한 후 9개의 값을 모두 더해주는 과정을 반복합니다. 예를 들어 첫 번째 과정은 (0X1) + (1X0) + (7X1) + (5X1) +(5X2) + (6X0) + (5X3) + (3X0) + (3X1)을 통해 40이라는 값이 나오는 것입니다. 이러한 연산 과정을 통해 나온 최종적인 2X2의 결과를 특성 맵(feature map)이라고 부릅니다.
또한 위의 예시에서는 필터를 한 칸씩 이동하며 연산을 하였는데 이렇게 몇 칸씩 이동하는지를 stride라고 합니다. 같은 이미지에 같은 필터라 하더라고 stride를 얼마 하는가? 뒤에 배우는 패딩을 어떻게 하냐에 따라 특성 맵의 크기가 달라집니다. 특성 맵의 크기를 어떻게 구하는지는 뒤에서 자세히 배우도록 하겠습니다.
이렇게 합성곱을 하면 공간적인 구조 정보를 얻을 수 있다고 하였는데 여기서 중요한 점은 매우 적은 가중치로 이를 가능하게 한다는 점입니다.
위의 그림은 다층 퍼셉트론에서 이미지를 처리하는 방법입니다. 이미지를 하나의 벡터로 만들고 각 원소를 은닉층에 연결하게 됩니다. 즉, 위의 예시에서는 총 9 X 4 =36개의 가중치(검정 연결선)를 가집니다.
하지만 합성곱 연산의 경우에는 2 X 2의 필터로 이미지의 모든 픽셀을 훑기 때문에 단 4개의 가중치만으로 공간적인 구조 정보까지 보존이 가능합니다. 왼쪽 그림은 합성곱을 다층 퍼셉트론 방식에 대응시킨 것입니다.
3. 다수 채널을 가진 합성곱 연산
2X2의 텐서에 대해서 합성곱 연산에 대해서 배웠으니 이제 실제로 사용되는 다수 채널을 가진 합성곱 연산 방법을 알아보도록 하겠습니다. 원리는 동일하니 그렇게 어렵지 않습니다!! 입력의 채널 수(깊이)와 필터의 채널 수(깊이)는 항상 같아야 한다. 이것만 기억하면 됩니다!!!
위의 그림과 같이 넓이 X 높이 X 깊이(3X3X3)인 입력이 들어왔다고 가정해봅시다. 필터의 깊이는 입력의 깊이와 같아야 하기 때문에 3이 되어야 할 것입니다. 즉 2X2 필터가 총 세 겹이 있는 것이라 생각하면 됩니다. 이제 각 채널이 입력의 한 개 채널씩 합성곱 연산을 하고 이를 모두 더하면 하나의 특성 맵이 나오게 됩니다. 여기서 중요한 점은 필터의 각 겹이 하나의 독립적인 필터인 것이 아니라 세 겹이 총하나의 필터, 즉 2X2X3의 커널인 것입니다.
다음과 같은 크기의 입력 데이터가 들어왔다고 가정했을 때 필터 하나의 채널 수는 이미지 데이터의 채널 수와 같아야 되겠죠? 그리고 필터의 각 채널이 대응하는 입력 데이터의 채널과 합성곱 연산을 수행하고 이들을 더하여 하나의 특성 맵을 만들 겁니다. 그럼 여기서 여러 개의 커널이 들어온다고 하면 각 커널은 하나의 특성 맵을 각각 생성할 것이고 결국 최종 결과물은 C0의 채널을 가진 특성 맵이 될 것입니다.
그렇다면 가중치의 수는 어떻게 될까요?? 순서대로 나눠서 생각해보도록 하겠습니다. 먼저 하나의 커널에는 Ci개의 채널이 존재합니다. 각 채널에는 Kh X Kw의 가중치가 존재합니다. 그럼 여기까지 가중치를 생각해보면 Kh X Kw X Ci가 되겠죠? 근데 이러한 커널이 총 C0개가 있다고 합니다. 그럼 최종적으로 가중치는 Kh X Kw X Ci X C0가 됩니다.
4. 패딩(Padding)
눈치가 빠른 분들은 눈치채셨을지도 모르겠지만 위에서 볼 수 있듯이 합성곱의 결과인 특성 맵은 기존의 이미지보다 작아집니다. 합성곱을 한 번만 진행한다면 문제가 되지 않을 수도 있지만 모델의 깊이가 깊어져 연산의 횟수가 증가하게 되면 그 결과로 나온 값의 크기는 매우 작아지게 될 것입니다. 이를 위한 해결책이 바로 패딩입니다.
패딩을 하는 방법은 간단합니다. 제로 패딩이라 하여 이미지의 상하좌우에 0을 한번 더 둘러주는 것입니다.(꼭 한 번이 아니라 폭을 어떻게 할지는 선택하는 것입니다.) 이를 통해 동일한 크기의 이미지와 필터를 이용하여 합성곱을 하였음에도 불구하고 이미지와 동일한 사이즈의 특성 맵을 얻을 수 있게 되었습니다.
5. 특성 맵의 크기 계산 방법
특성 맵의 크기를 계산하는 것은 매우 간단합니다. 아래의 식에 대입만 하면 됩니다. 왜 아래와 같은 식이 나오는지는 조금만 생각해보면 쉽게 이해할 수 있습니다.
6. 풀링(Pooling)
패딩은 특성 맵의 사이즈를 보존해주는 역할을 했다면 풀링은 반대로 특성 맵의 사이즈를 줄여 가중치의 개수를 줄이는 역할을 합니다. 풀링에도 패딩과 동일하게 커널과 stride의 개념이 존재합니다.
위의 예시는 2X2의 커널이 2 stide로 이동할 때의 max-pooling을 나타내고 있습니다. 커널이 이동하면서 대응되는 영역의 최댓값을 구하면 max-pooling, 평균을 구하면 average-pooling이 됩니다.
자 이렇게 CNN에 핵심적인 개념을 모두 알아봤습니다.
막상 정리하고 보니 그렇게 많은 양은 아닌 것 같은데
처음 접하다 보니 많은 낯선 것 같습니다 ㅠㅠ
다음 시간에는 CNN을 이용한 MNST 실습을 진행해보도록 하겠습니다.
어느새 벌써 가을이 다가오는 게 느껴지네요 ㅎㅎ
파이팅합시다!!!!!
'모두를 위한 딥런닝 by PyTorch' 카테고리의 다른 글
Lab 07-2 DNN (0) | 2021.09.05 |
---|---|
Lab-07-1 DNN (0) | 2021.08.24 |
Lab-06 Softmax Classification (0) | 2021.08.14 |
Lab-05 Logistic Regression (0) | 2021.08.12 |
Lab-04-2 Minibatch Gradient Descent (0) | 2021.08.09 |