핸즈온머신러닝&딥러닝

합성곱 신경망을 사용한 컴퓨터 비전 1

threegopark 2021. 4. 12. 16:47
728x90

시각 피질 구조

 

우리 눈의 시각 피질 안에 존재하는 뉴런은 시야의 일부 범위 안에 있는 시각 자극에만 반응하며 이러한 시야의 작은 영역에 있는 특정 패턴을 국부 수용장이라고 한다. 

 

선분 만을 감지하는 뉴런, 원 만을 감지하는 뉴런 등등 다양한 뉴런이 겹치게 되어 전체적인 시야를 인지할 수 있게 되는 것이다. 이러한 관찰은 고수준 뉴런이 이웃한 저수준 뉴런의 출력에 기반한다는 아이디어를 이끌어냈으며 이러한 강력한 구조가 전체 시야 영역에 포함된 모든 종류의 복잡한 패턴을 감지할 수 있게 한다.

특히 이러한 연구는 우리가 CNN, 합성곱 신경망이라고 부르는 모델로 점차 진화되었으며 많은 파라미터로 인해 이미지 인식 문제에 적용이 매우 어려운 완전 연결 층의 심층 신경망 대신에 사용되기 시작하였다.

 

 

합성곱 층

 

CNN의 가장 중요한 구성 요소는 합성곱 층이다. 합성곱이란 한 함수가 다른 함수 위를 이동하면서 원소별 곱셈의 적분을 계산하는 수학 연산으로 합성곱 연산의 정의는 두 함수 중 하나를 반전시키는 것, 즉, 입력 이미지나 필터 중 하나는 뒤집어서 연산해야 한다는 의미이다. 

 

https://tensorflow.blog/2017/12/21/convolution-vs-cross-correlation/

 

초록색 층(합성곱 층)은 입력 이미지(파란색)의 모든 픽셀에 연결되는 것이 아니라 합성곱 층 뉴런의 수용장 안에 있는 픽셀에만 연결된다. 이런 구조는 네트워크가 첫 번째 은닉층에서는 저수준 특성에 집중하고, 그 다음 은닉층에서는 더 큰 고수준 특성으로 조합해나가도록 도와준다. 

++ 기존의 신경망들은 입력 이미지를 주입하기 전에 1D로 Flatten 해야 했지만, 애니메이션에서 볼 수 있듯이 CNN에서는 각 층이 2D로 표현되므로 뉴런을 그에 상응하는 입력과 연결하기 더 쉽다.

 

 

위 그림에서처럼 CNN은 2D 배열로 표현된다. 간단히 살펴보면 어떤 층의 i행, j열에 있는 한 뉴런은 이전 층의 i행에서 i+fh-1 까지의 행과 j열에서 j+fw-1까지의 열에 있는 뉴런의 출력에 연결된다. fh와 fw는 국부 수용장의 높이와 너비이며 상황에 따라 그림과 같이 zero padding을 추가하여 수용장의 높이와 너비를 이전 층과 같게 하는 경우도 있다.

 

 

아래 그림처럼 수용장 사이에 간격을 두어 큰 입력층을 훨씬 작은 층에 연결하는 것도 가능하다. 이렇게 하면 모델의 계산 복잡도를 크게 낮춰준다. (차원 축소)

 

여기서 한 수용장에서 다음 수용장 사이의 간격을 스트라이드라고 한다. (헷갈릴 수도 있어서 나는 "이전 수용장의 +방향 끝 모서리부터 다음 수용장의 +방향 끝 모서리까지의 거리"라고 생각하고 있다.)

 

정확히 짚고 넘어가기 위해 다음 예를 가지고 왔다. 

1x1 제로패딩된 5x5 입력에 2x2 스트라이드로 3x3 커널이 적용된 예이다.

 

 

https://tensorflow.blog/a-guide-to-convolution-arithmetic-for-deep-learning/

 

 

 

필터

 

 

뉴런의 가중치는 수용장 크기의 작은 이미지로 표현될 수 있다. (이전 수용장 크기(=수용장 내의 픽셀 수)만큼의 가중치가 존재하므로)

필터합성곱 커널이라고도 불리우며 필터는 가중치의 값으로 이루어져 있다. 필터는 이전 층을 얼마나, 어떻게 바꾸라는 정보를 담고 있으며 만약 1행 1열은 a로 바꾸지만 나머지는 0으로 바꾸라는 필터가 존재한다면, 이 필터를 거친 입력 층은 특정 부분이 a이고 나머지가 0인 출력 층을 만들게 된다. 그리고 이러한 출력 층을 특성 맵이라고 한다.

 

수동으로 필터를 정의할 필요가 없다. 훈련하는 동안 합성곱 층이 자동으로 해당 문제에 가장 유용한 필터를 찾고 상위 층은 이들을 연결하여 더 복잡한 패턴을 학습한다.

 

 

 

여러 가지 특성 맵 쌓기

 

 

실제 합성곱 층은 여러 가지 필터를 가지고 필터마다 하나의 특성 맵을 출력한다. 즉, 합성곱 층 하나는 입력에 여러 필터를 동시에 적용하여 입력에 있는 여러 특성을 감지할 수 있으며 이러한 특성때문에 3D로 표현한다.

 

각 특성 맵의 픽셀은 하나의 뉴런에 해당하고 하나의 특성 맵 안에서는 모든 뉴런이 같은 파라미터(가중치와 편향)을 공유하지만, 다른 특성 맵에 있는 뉴런은 다른 파라미터를 사용한다. 이러한 특징은 모델의 전체 파라미터 수를 급격하게 줄여준다. CNN이 한 지점에서 패턴을 인식하도록 학습되었다면 다른 어느 위치에 있는 패턴도 인식할 수 있다는 의미이다.

 

++ 입력 이미지는 컬러 채널마다 하나씩 여러 서브 층으로 구성되기도 한다. (RGB) 

     흑백 이미지는 하나의 채널만 가진다.

 

 

 

텐서플로 구현

 

텐서플로에서 각 입력 이미지는 보통 [높이, 너비, 채널] 형태의 3D 텐서로 표현되고 하나의 미니배치와 가중치는 [미니배치 크기, 높이, 너비, 채널] , [f1, f2, f3, f4] 형태의 4D 텐서로 표현된다. 편향은 간단하게 1D 텐서로 표현된다.

 

간단한 코드들로 실습을 해보면

 

 

하이퍼 파라미터 padding 은 "VALID" 나 "SAME" 중 하나로 지정할 수 있는데 VALID로 지정할 경우 합성곱 층에 제로 패딩을 사용하지 않는다. 경계 밖으로 나가지 않기 위해 가장 마지막 수용장 값이 무시될 수 있다.

SAME으로 지정할 경우 제로패딩을 적용하여 수용장에서 누락되는 입력 값이 없도록 한다.