본문 바로가기

코딩/Deep Learning

[파이썬/Pytorch] 딥러닝- CNN(Convolutional Neural Network) 1편

반응형

 

1. CNN(컨볼루션 뉴럴 네트워크)

 

  -. 이미지 처리에 탁월한 성능을 보이는 딥러닝 모델 중 하나

  -. 왜 이미지 처리에 탁월한가?

    : 컨볼루션 연산을 통해 이미지의 공간적인 구조 정보를 보존하면서 학습한다. 공간적인 구조 정보란 이미지의 인접 한 픽셀들끼리 어떤 관계가 있는지 파악할 수 있는 정보를 말한다.

 

 

 

2. CNN을 위한 기본 내용

 

 

1) 채널(Channel)

 

<채널의 개념>

 CNN 연산을 위해서는 채널이라는 용어를 먼저 이해해야 한다. 실제 파이토치 파이썬 코드 적용시 채널 파라미터를 입력하기 때문이다.

 

-. 채널은 입력의 3차원 정보를 의미 함.

-. 일반적인 흑백 이미지라면 1차원 (Channel = 1)

-. R,G,B 컬러 이미지라면 3차원 (Channel = 3)

 

 

2) Convolution 연산

 

<컨볼루션 연산 과정>

 

  컨볼루션은 연산 과정은 커널이라는 행렬을 입력과 겹쳐지면서 이루어진다. 컨볼루션 연산을 통해 이미지의 특징을 추출하는 역할을 할 수 있다. 실제 구글링이나 아래 하단의 참고링크를 보면 계산과정을 쉽게 찾아볼 수 있으니 연산 과정은 생략한다.

 

  중요한 것은 커널을 통해 특성맵(Feature map)이라는 결과를 얻는다는 것. 위 이미지는 컨볼루션 계산을 1번 한 결과이다. 5*5 입력 행렬에 3*3 커널을 통해 이동범위를 1로 계산했을 시 3*3 특성맵을 얻는다는 것을 알 수 있다. 여기서 이동범위는 스트라이드(stride)라고 하는데 위 그림에서는 스트라이드=1이다.

 

  이 그림이 중요한 이유는 실제 CNN 딥러닝 모델에서는 컨볼루션 계산을 여러번 하기 때문에 특성맵의 크기를 정확히 알아야 다음 컨볼루션 층을 구성할 수 있다. 특성맵의 크기를 계산하는 방법은 아래 이미지를 참고해보자.

 

 

<특성맵 크기 계산>

 

  위 계산은 스트라이드=1인 경우로, 스트라이드가 커질 수록 당연히 특성맵의 크기는 줄어든다. 계산식은 참고링크 - "pytorch로 시작하는 딥러닝 입문'이라는 책에 있으니 참고해보도록 하자.

 

  위 경우는 채널=1인 경우로서, 채널이 여러개인 입력의 경우 커널이 채널개수만큼 있다고 이해하면 된다. 아래 그림에는 표현하지 않았지만 특성맵의 개수는 각 각 커널을 통해 계산한 결과를 더한 1개이다. 헷갈리지 말도록 하자.

 

<다중 채널 입력의 경우 커널이 채널수만큼>

 

반응형

 

 

3) 1개 Convolution layer에 여러개 커널 두기

 

  위에서도 언급한 내용이지만 실제 CNN 딥러닝 모델에서는 여러개의 컨볼루션층을 둔다. 1개의 컨볼루션 층에서도 1개의 커널이 아닌 여러 개의 커널을 둘 수 있다. 이 부분이 헷갈릴 수 있는데 2)에서 마지막 이미지인 채널수에 따른 커널1,2,3가 아닌 여러 필터층을 가질 수 있다는 것이다. 아래 그림을 보며 이해해보자.

 

 

-. 입력은 채널이 3개인 컬러이미지다.

-. 1개의 커널은 3개의 채널을 가진다

-. 그림에서 보듯이 1개 컨볼루션층에서 3개의 채널을 가진 커널이 Z개 있을 수 있다.

-. 각 커널의 채널수는 입력의 채널수와 동일해야 한다.

-. 특성맵의 채널수는 당연히 컨볼루션 연산시 사용했던 채널 수와 동일하다.

(결과적으로 각 채널에 따른 계산을 모두 더해서 특성맵은 1개)

 

-.  위 경우처럼 1개 컨볼루션층에서 여러개 커널을 가질 경우의 가중치 수는 

 

 

  채널의 가로크기 * 채널의 세로크기 * 채널 수 * 커널 수 = 총 가중치 w 의 개수

 

 

  위 내용을 공부하다보면 1개 컨볼루션층에 커널을 여러개 두는게 무슨 의미가 있냐고 의문이 들 수 있다. 커널수를 늘린다는 것은 다중 퍼셉트론에서 은닉층을 늘리다는 것과 같다. 즉, 가중치 w 개수를 키운다는 것이다.

 

  딥러닝에서는 과적합, 과소적합이라는 용어가 있다. 여기서 자세하게 정리하진 않겠지만 간단하게 요약하면 이런 말이다. 데이터를 너무 과하게 학습시키거나 적게 학습시키면 딥러닝의 성능이 저하된다는 것이다. 일반적으로 데이터가 많은 경우 w를 늘리고, 적은 경우 w를 줄인다고 한다.

 

  CNN의 풀링, 파이토치를 통한 코드 적용에 대해서는 다음 포스팅에서 정리해 볼 예정이다.

 


참고링크 : https://wikidocs.net/62306

 

01. 합성곱과 풀링(Convolution and Pooling)

합성곱 신경망(Convolutional Neural Network)은 이미지 처리에 탁월한 성능을 보이는 신경망입니다. 이번 챕터에서는 합성곱 신경망에 대해서 학습합니다. ...

wikidocs.net

 

728x90