[밑딥] 7장. 합성곱 신경망(CNN)

Speedwell🍀·2022년 6월 8일
0


참고)
https://je-d.tistory.com/69

특히 "이미지 인식" 분야에서 딥러닝을 활용한 기법은 거의 다 CNN(Convolutional Neural Network)을 기초로 한다.
(합성곱: 두 함수 중 하나를 반전(reverse), 이동(shift)시켜가며 나머지 함수와의 곱을 연이어 적분한다.)

이번 장에서는 CNN의 메커니즘을 자세히 알아보고 이를 파이썬으로 구현해보자!


1. 전체 구조

CNN도 지금까지 본 신경망과 같이 레고 블록처럼 계층을 조합하여 만들 수 있다.
다만, CNN에서는 합성곱 계층(convolutional layer)풀링 계층(polling layer)이 새롭게 등장!

이 계층들을 어떻게 조합하여 CNN을 만드는지 살펴보자!


완전연결 계층 vs. CNN

완전연결 계층

지금까지 본 신경망은 인접하는 계층의 모든 뉴런과 결합되어 있었다.
➡️ 이를 완전연결(fully-connected, 전결합)이라고 하며, 완전히 연결된 계층을 Affine 계층이라는 이름으로 구현했다.

위는 층이 5개인 완전연결 신경망이다.
완전연결 신경망은 Affine 계층 뒤에 활성화 함수를 갖는 ReLU 계층(혹은 Sigmoid 계층)

위 그림에서는 Affine-ReLU 조합 4개가 쌓였고, 마지막 5번째 층은 Affine 계층에 이어 소프트맥스 계층에서 최종 결과(확률)를 출력


CNN

CNN에서는 합성곱 계층; Conv풀링 계층; Pooling이 추가된다.
CNN의 계층은 Conv-ReLU-(Pooling) 흐름으로 연결된다.

📌 CNN에서 주목할 점 중 하나는 출력에 가까운 층에서는 지금까지의 'Affine-ReLU' 구성을 사용할 수 있다는 것!
마지막 출력 계층에서는 'Affine-Softmax' 조합을 그대로 사용!


각 계층 사이에는 3차원 데이터같이 입체적인 데이터가 흐른다는 점에서 완전연결 신경망과 다르다!


2. 합성곱 계층

2-1) 완전연결 계층의 문제점

완전연결 계층에서는 인접하는 계층의 뉴런이 모두 연결되고 출력의 수는 임의로 정할 수 있다.

👎완전연결 계층의 문제점은 데이터의 형상이 무시된다는 것!

예를 들어 입력 데이터가 이미지인 경우에, 이미지는 세로/가로/채널(색상)의 3차원 형상을 가지는데, 완전연결 계층에 입력할 때는 3차원 데이터를 평평한 1차원 데이터로 평탄화해줘야 한다.

이미지는 3차원 형상이며, 이 형상에는 소중한 공간적 정보가 들어있다. 3차원 속에서 의미를 갖는 본질적인 패턴이 숨어 있을 것이다.
➡️ 완전연결 계층은 형상을 무시하고 모든 입력 데이터를 동등한 뉴런(같은 차원의 뉴런)으로 취급하여 형상에 담긴 정보를 살릴 수 없다.


합성곱 계층은 형상을 유지!

이미지도 3차원 데이터로 입력 받으며, 다음 계층에도 3차원 데이터로 전달한다.
➡️ CNN에서는 이미지처럼 형상을 가진 데이터를 제대로 이해 가능성↑

CNN에서 합성곱 계층의 입출력 데이터 ➡️ 특징 맵(feature map)
합성곱 계층의 입력 데이터: 입력 특징 맵(input feature map)
합성곱 계층의 출력 데이터: 출력 특징 맵(output feature map)


2-2) 합성곱 연산

합성곱 연산은 이미지 처리에서 말하는 필터 연산에 해당

합성곱 연산은 입력 데이터에 필터를 적용한다.
데이터와 필터의 형상을 (height, width)로 표기 (문헌에 따라 필터를 커널로 칭하기도 한다.)


  1. 합성곱 연산은 필터의 윈도우(window)를 일정 간격으로 이동해가며 입력 데이터에 적용한다.
  2. 입력과 필터에서 대응하는 원소끼리 곱한 후 그 총합을 구한다. → (단일 곱셈-누산(FMA; fused multiply-add))
  3. 그리고 그 결과를 출력의 해당 장소에 저장한다.
    ➡️ 이 과정을 모든 장소에서 수행하면 합성곱 연산의 출력이 완성된다.


완전연결 신경망에는 가중치 매개변수와 편향이 존재하는데, CNN에서는 필터의 매개변수가 그동안의 '가중치'에 해당한다.
CNN에도 편향이 존재한다. (위의 그림은 필터를 적용하는 단계까지만. 편향까지 포함하면 아래 그림과 같다.)

편향은 필터를 적용한 후의 데이터에 더해진다.

편향은 항상 하나(1x1)만 존재 → 그 하나의 값을 필터를 적용한 모든 원소에 더하는 것


2-3) 패딩 (padding)

: 합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값(ex. 0)으로 채움

❗합성곱 연산에서 자주 사용하는 기법

📌 패딩은 주로 출력 크기를 조정할 목적으로 사용!

위의 그림을 예로 들면, (4,4) 입력 데이터에 (3,3) 필터를 적용하면 출력은 (2,2)가 되어, 입력보다 2만큼 줄어든다.
→ 이는 합성곱 연산을 되풀이하는 심층 신경망에서 문제가 될 수 있다!

합성곱 연산을 거칠 때마다 크기가 작아지면 어느 시점에서는 출력 크기가 1이 될 것이다.
더 이상은 합성곱 연산을 적용❌


이러한 사태를 막기 위해 패딩 사용!!
위의 그림을 보면 패딩을 이용해 입력에 대한 출력이 같은 크기로 유지했다.
➡️ 입력 데이터의 공간적 크기를 고정한 채로 다음 계층에 전달할 수 있다!


2-4) 스트라이드 (stride)

: 필터를 적용하는 위치의 간격


📌 스트라이드를 키우면 출력 크기가 작아진다. 한편, 패딩을 크게 하면 출력 크기는 커진다.

➡️ 이러한 관계를 수식화해보자!

아래는 출력 크기를 구하는 식이다.

❗위의 수식이 정수로 나눠떨어지는 값이어야 한다는 점에 주의
→ 딥러닝 프레임워크 중에 값이 딱 나눠떨어지지 않을 때 에러를 내지 않고 진행하도록 구현하는 경우도 있다.


2-5) 3차원 데이터의 합성곱 연산

앞에서 본 세로/가로에 더해서 채널까지 고려한 3차원 데이터를 다루는 합성곱 연산을 살펴보자!

위의 그림을 보면 2차원일 때와 비교해서, 채널 방향으로 특징 맵이 늘어났다.

채널 쪽으로 특징 맵이 여러 개 있다면 입력 데이터와 필터의 합성곱 연산을 채널마다 수행하고, 그 결과를 더해서 하나의 출력을 얻는다.

❗3차원의 합성곱 연산에서 주의할 점은 입력 데이터의 채널 수와 필터의 채널 수가 같아야 한다는 점!

필터 자체의 크기는 원하는 값으로 설정할 수 있다.
(단, 모든 채널의 필터가 같은 크기여야 한다!)


2-6) 블록으로 생각하기

0개의 댓글