Notice
Recent Posts
Recent Comments
05-18 01:37
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Byeol Lo

밑바닥부터 시작하는 딥러닝1 - 5. 합성곱 신경망 CNN 본문

AI

밑바닥부터 시작하는 딥러닝1 - 5. 합성곱 신경망 CNN

알 수 없는 사용자 2023. 6. 15. 17:46

 기본적으로 신경망에서 Affine Layer - Activation Layer(ReLU) 등의 반복되는 연결들을 많이 보았다. 하지만 이번에는 Affine Layer을 다른 연산을 수행할 수 있는 계층으로 바꿔서 수행할 수 있다.

 

CNN 구조

  1. Conv
  2. ReLU
  3. Pooling - 선택사항

 지금까지 본 신경망들은 계층 간의 노드들이 전부 연결되어 있는 완전연결 신경망(Fully-connected, 전결합)임을 알았다. 완전연결 신경망은 Affine 계층 뒤에 활성화 함수를 갖는 ReLU 계층 혹은 Sigmoid 계층이 이어졌는데, CNN은 이렇게 이어지는게 아닌 위의 세 항목들로 이어진다. 여기서 Conv를 "합성곱 계층", Pooling을 "풀링 계층"이라고 부른다.

 따라서 Affine-ReLU로 연결되었던 것이 Conv-ReLU-(Pooling)으로 바뀌었다고 보면 된다. 또한 CNN - CNN - ... - Affine - ReLU - ... 로도 구성할 수 있고, 분류 문제이면 Affine-Softmax를 아니면 Affine-Sigmoid를 쓰면서 데이터에 따른 문제의 유형들을 다른 방식으로 풀 수 있다.

 

Conv(합성곱) Layer

1 1 1 1 1       필터Filter
커널Kernel
                 
1 2 2 2 1       3 2 3   B       30 40 30  
1 2 3 2 1   *   2 1 2   + 4   =   40 47 40  
1 2 2 2 1       3 2 3           30 40 30  
1 1 1 1 1                              

 합성곱은 2차원, 3차원, ... 등의 데이터에서 인접한 데이터 간의 관계를 학습하게 해준다. 따라서 영상이나 이미지 처리에 능숙한데, 합성곱은 그냥 대응되는 자리의 원소들을 곱하고, 모든 자리들의 곱에 대해 합을 구한 후 차례대로 쓰면 된다. 이런 계산을 단일 곱셈-누산(fused multiply-add, FMA)라고 한다. 또한 이렇게 곱 말고도 편향을 더해줄 수도 있다.

 근데 위처럼 된다면, 학습에 있어서 가장자리의 부분은 학습 균형이 안맞을 수 있다. 이를 위해 패딩(padding)이라는 것을 통해 입력 데이터 주변에 액자처럼 씌우는 작업을 하게 된다. 보통 0을 초깃값으로 하고 폭(width)를 설정한 후에 입력 데이터(N by N)에 대해 패딩시켜 입력데이터를 (N+width) by (N+width)로 바꿀 수 있다. 위에서는 가장자리에 대해 학습 균형이 중심부와 안맞으므로 패딩을 width=1로 주어 맞출 수 있겠다.

 또한 스트라이드(Stride)로 계산의 방법을 다르게 하여 결과 형상(shape)를 조절할 수도 있다. 스트라이드는 filter가 입력 데이터에 대해 연산을 한 후에 다음 연산을 수행하기 위해 이동해야하는 거리를 의미한다. 보통 이는 1로 설정되어 있지만, 입력 특징맵(input feature map)에 따라, 출력 특징맵(output feature map)에 따라 형상과 연산의 필요성이 있는 부분만 효율적으로 학습을 하도록 할 수 있다.

 다음은 출력 특징맵(output feature map)의 height와 width를 계산하는 수식이다. W는 입력 특징맵의 width이며, H는 입력 특징맵의 height, FH는 Filter Height, FW는 Filter Width, P는 Padding이다. 이때 출력의 넓이와 높이는 무조건 정수로 되어야 한다. 빨리 계산하고, Stride를 설정하기 위해서는 입력의 가로, 세로가 패딩의 두배가 더해지고, 필터의 가로 세로를 뺐을때, 스트라이드의 배수이면 된다.

 하지만 여기서 우리는 흑백 사진(gray scaled picture)에 대해서만 보았다. 이는 한 픽셀에 하나의 값 밖에 안들어간 데이터라는 소리이다. RGB를 나타내려면 Gray만 나타낼 수 있는 하나의 값이 아니라 2개의 값이 더 필요하기에 차원을 하나 더 늘릴 필요가 있다. 따라서 위에서는 input dimension이 2였지만, rgb 그림의 데이터는 dimension이 3으로 늘어난다.

 위에서 입력을 (C, H, W)로 넣고, Filter 또한 3차원이고, 필터를 거친 값들은 전부 더해지기 때문에 똑같이 2-dim 행렬이 나온다. 이때 Channel을 RGB의 데이터로 볼 수 있겠다. 지금은 하나의 노드(filter)에 대한 것이지만, 이를 더 일반화하면 다음과 같다.

 이를 통해 필터의 개수 또한 dim에 추가되어 총 4-dim 연산이 될 수 있다.

 


 

Pooling Layer

 풀링은 width, height의 크기를 줄이지만, channel은 줄이지 않는다. 풀링 계층의 종류는 다음과 같다.

  • Min Pooling
  • Max Pooling
  • Average Pooling

이 외에도 다른 연산을 하여 더 추가할 수 있을 것이다. 풀링은 n*n의 크기의 윈도우(window)를 통해 해당 값의 max나 average 등의 연산을 통해 원소를 각각 꺼내어 다시 내보내는 개념이다. 풀링 계층의 장점은 다음과 같다.

  • 학습 파라미터가 없다
  • 채널 수가 변하지 않는다.
  • 입력의 변화에 영향을 적게 받는다. - 강건하다

여기까지가 Conv Layer( conv-ReLU-pooling )의 전부이다.

Comments