본문 바로가기

AI

합성곱 신경망(CNN)을 파헤쳐 보자!

7~8월은 <밑바닥부터 시작하는 딥러닝 1>이라는 책으로 딥러닝의 기본 컨셉을 복습하고, 이미지 인식 분야에서 가장 많이 사용되는 합성곱 신경망(Convolutional Neural Network, CNN)에 대해 알아보았다.

 

이번 블로그 포스팅에서는 책을 다 뗀 기념으로(?), CNN에 대한 내용을 정리해 보려고 한다! 

(아래 그림의 출처는 https://github.com/WegraLee/deep-learning-from-scratch입니다.)

 

https://product.kyobobook.co.kr/detail/S000001057805

 

밑바닥부터 시작하는 딥러닝 | 사이토 고키 - 교보문고

밑바닥부터 시작하는 딥러닝 | 직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서!『밑바닥부터 시작하는 딥러닝』은 라이브러리나 프레임워크에 의존하지 않고, 딥러닝의 핵심을 ‘

product.kyobobook.co.kr

 

CNN의 전체 구조

지금까지 내가 접한 신경망은 인접하는 계층의 모든 뉴런과 결합되어 있었다.

이처럼 각 입력 노드가 모든 출력 노드에 연결된 계층을 완전연결계층이라고 하며, Affine 계층이 대표적인 예다.

 

CNN에서는 합성곱 계층풀링 계층이 새롭게 추가된다.

이 둘은 완전연결계층과 달리, 입력의 일부분과 출력의 일부분이 연결되는 구조이다.

 

그렇다면 합성곱 계층과 풀링 계층은 무엇인지 차근차근 알아보도록 하자.

 

합성곱 계층

합성곱 계층에 대해 설명하기 전에, CNN이 왜 이미지 인식에 특화되어 있는지 생각해 본 적이 있는가?

 

완전연결계층는 3차원 이미지 데이터를 1차원 데이터로 평탄화하는 작업을 거친다. 

이것의 문제점은, 데이터의 형상이 무시된다는 사실이다.

 

하지만 합성곱 계층형상을 유지하기 때문에 이미지처럼 형상을 가진 데이터를 제대로 이해할 수 있다.

 

그렇다면 합성곱 연산은 어떻게 하는 걸까?

 

위의 그림과 같이 합성곱 연산입력 데이터에 필터를 적용하는데, 필터의 윈도우(밑의 그림에서 회색 부분)를 일정 간격으로 이동한다. 입력과 필터에서 대응하는 원소끼리 곱한 후 그 총합을 구한다. 

 

물론, 가중치도 있다.

 

이렇게 간단할 수가. 하지만 풀링 계층으로 넘어가기 전에, 대표적인 두 개의 용어를 꼭 알아야 한다.

그것은 바로 패딩스트라이드!

 

패딩

합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값(보통 0)으로 채우는 기법패딩이라고 한다.

 

패딩을 왜 할까? 입력 데이터와 동일한 크기로 출력 데이터의 크기를 조정하기 위해서이다.

만약 그렇지 않다면, 합성곱 연산을 거칠 때마다 크기가 작아져서 어느 시점에서는 출력 크기가 1이 되어버려 더 이상 합성곱 연산을 적용할 수 없게 된다.

 

스트라이드

필터를 적용하는 위치의 간격스트라이드라고 한다.

위의 예시에서는 간격이 1이었지만, 스트라이드를 2로 하면 아래 그림과 같이 적용된다.

 

 

패딩(P), 스트라이드(S), 입력 크기(H,W), 필터 크기(FH,FW), 출력 크기(OH, OW) 간의 관계는 다음과 같다.


 

3차원 데이터의 합성곱 연산

지금까지는 2차원 형상의 합성곱 연산을 다뤘지만, 이미지는 3차원 형상(세로, 가로, 채널)이다.

이때 채널은 색상(R,G,B)를 의미한다.

 

이처럼 3차원 데이터의 합성곱 연산을 수행할 때 주의할 점은 입력 데이터의 채널 수와 필터의 채널 수가 같아야 한다.

만약 필터를 여러 개 사용한다면, 출력 데이터도 그만큼 생성된다. 

 

또한, 합성곱 연산에서도 배치 처리를 할 수 있다.

 

풀링 계층

풀링은 아래 그림과 같이 2X2 원소 영역을 원소 하나로 집약하여 세로, 가로 방향의 공간 크기를 줄이는 연산이다.

풀링에는 여러 가지 종류가 있는데, 아래 그림은 최대 풀링을 스트라이드 2로 처리하는 순서이다(보통 윈도우 크기와 스트라이드는 같은 값으로 설정하는 것이 보통임).

 

풀링 계층의 특징은 다음과 같다.

 

1. 합성곱 계층과 달리 학습해야 할 매개변수가 없음

2. 입력 데이터의 채널 수 그대로 출력 데이터를 내보냄

3. 입력의 변화에 영향을 적게 받음

 

CNN 구현하기

합성곱 계층과 풀링 계층에 대해 각각 알아보았으니, 이제는 이 둘을 조합하여 CNN을 완성해 보고 MNIST 데이터셋을 학습시켜 정확도를 구해보자. 아래 깃허브 사이트에 코드를 올려 놓았다.

 

https://github.com/ratel0307/Deep-Learning/blob/main/%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94%20%EB%94%A5%EB%9F%AC%EB%8B%9D%201/7%EC%9E%A5_CNN.ipynb

 

Deep-Learning/밑바닥부터 시작하는 딥러닝 1/7장_CNN.ipynb at main · ratel0307/Deep-Learning

딥러닝 스터디 기록용입니다. Contribute to ratel0307/Deep-Learning development by creating an account on GitHub.

github.com

 

 

직접 해본 결과!

 

 

+ 08.12(월)에 비대면으로 스터디를 진행하였다. 직접 ppt 만들고 강의를 했다. 

https://www.youtube.com/watch?v=vCD1-lmFmQk