본문 바로가기
코딩 독학/CS231n

[cs231n] 5강. Convolutional neural networks

by 효니루 2020. 11. 8.

✔ 본 포스팅은 20/10/10 ~ 20/12/26 동안 진행하는 가짜연구소 딥러닝기초이론스터디를 통해 학습한 내용입니다.

 

✔ 본 포스팅은 스탠포드 대학의 cs231n 강의를 정리한 내용입니다.

 

 

Fully connected layer : 벡터화한 input에 같은 demension을 가진 각 class의 가중치벡터를 곱해 각 클래스의 활성화점수를 구한다.

convolution layer : 3차원의 shape을 가진 이미지의 shape을 그대로 보존, 같은 depth를 가진 weight matrix 생성


1. CNN 의 구성

CNN 을 크게 보면 위와 같다.

 

  • 특징추출영역 : Convolution layer , Pooling layer
    - Convolutiona layer : 입력데이터에 필터적용 + 활성화함수를 반영
    - Pooling layer : Convolutiona layer의 출력데이터를 받아 크기벼형 또는 특정데이터를 강조하는 용도로 사용
  • 이미지분류영역 : Fully Connected layer 

다음의 순서대로 공부해보자.

(1) Convolutiona layer

(2) Pooling layer

(3) Fully Connected layer

 

 

Convolutional Layer

 

Convolutional layer

convolution이란 합성곱을 의미한다. 앞으로 CNN에서 Convolutional layer를 입력데이터가 지나면서, 이 합성곱이라는 과정을 거치게 되는데 먼저 알아보고 가자.

1. Convolution, 합성곱의 뜻 (*) 

Convolution 이란 합성곱이라고 하는데, 신호들 간의 관계를 파악하기 위해서 등장했다고 한다.

식을 먼저 살펴보자.

출처 : https://m.blog.naver.com/PostView.nhn?blogId=sw4r&logNo=220904800372&proxyReferer=https:%2F%2Fwww.google.com%2F

 

x와 w라는 신호를 컨볼루션연산을 하면 y라는 신호를 결과로 얻게 된다.

왼쪽 식을 먼저 살펴보면, x와 w의 신호값을 모든 범위에서 곱할 것인데, w를 y축 대칭이동하고, n만큼 x축방향으로 평행이동하여 곱할 것이다. 그리고 그 값을 모두 더한 값인 y[n] 값들의 집합이 컨볼루션 연산의 결과이다.

오른쪽 그림을 보면, w 그래프를 y축 대칭이동하여 w축에 대해 왼쪽부터 오른쪽으로 이동해가면서 서로의 값을 곱하게 되고, 바닥에 붙어있는 값은 0이니 볼록 튀어나온 부분이 겹치는 만큼 곱셈값이 증가한다. 가장 가운데에 서로 겹쳤을 때 x * w는 가장 큰 값이 나오고 이렇게 서로의 관계특성을 추출해낸다.

 

이는 Convolutional Layer의 계산 방식이다. W라는 필터가 입력데이터의 모든 부분을 한칸씩 훑고 지나가며 원소간의 곱셈을 모두 더한 값을 반환하여 새로운 activation map을 구성했던 것과 같다.

 

아래 그림이 해당 내용이다.

 

출처 : https://m.blog.naver.com/PostView.nhn?blogId=sw4r&logNo=220904800372&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

2. Fully Connected Layer와 Convolutional layer

기존의 인공신경망에서는 입력데이터를 1차원(배열) 형태로 펼쳐서 계산하는 Fully Connected Layer를 이용했다.

1개의 input 벡터의 차원이 3072이고, 이 input을 분류할 클래스가 위에서는 10개라고 했을 때, (10, 3072) 크기의 W matrix와 행렬곱연산(dot)을 하면, (1, 10) ndarray가 반환된다. 이때, 각 열의 숫자는 각 클래스에 대한 input vector의 score이다.

 

하지만 컬러사진은 3차원 데이터고, 이를 Fully Connected Layer에 넣기 위해서는 1차원 벡터로 펴주는 과정에서 이미지의 공간 정보가 손실된다. 이 한계를 극복하기 위해 나온 것이 Convolution Layer이다.

 

CNN의 Convolution layer에서는 input을 벡터로 펴지 않고, shape을 그대로 유지한다.

 

 

차이점은 weight matrix의 모양이다.

input = (32, 32, 3)      weight = (5, 5, 3)

weight matrix의 depth, 그림에서는 사각형의 깊이 3 부분,는 input matrix와 같아야 한다.

weight matrix의 width와 height (?)는 알아서 정하면 되는데, 저만큼의 크기를 input matrix의 가장 위쪽부터 차례로 한방향으로 슬라이딩 해가면서 곱하게 된다.

이 경우 결과로 (28, 28, 1) matrix가 나오게 된다.

# 가로=5 일때, 32개의 pixel의 1번째 위치부터 한칸씩 이동하면, 가장 마지막 순서의 첫번째 pixel 위치는 28번째 위치일 것임.

 

 

Convolution layer에서는 더 정확하게 사진을 분류하기 위해, weight matrix를 여러개 적용하여 더 많은 특성을 추출해낸다.

 

 

같은 크기의 서로 다른 weight matrix를 적용해 여러겹의 activation map을 구하게 된다.

만약 weight 가 6개라면, 6개의 activation map이 쌓여 (28, 28, 6) 크기의 matrix가 만들어진다.

 

 

그리고 이 Convolutional layer가 쌓인 것이 Convolutional Neural network이다.

위와 같이 32x32x3 크기의 input이  같은 depth를 가진 weight matrix 6개와 relu함수 연산을 지나 28x28x6 크기의 output matrix가 될 것이다.

 

그리고 이것을 다시 반복하면 아래와 같다.

 

두번째 layer에서는 input이 28x28x6 이기 때문에 weight의 depth또한 6이여야 한다.

output matrix가 24x24x10인 것을 보니, weight matrix는 5x5x6 이 10개 있었나보다 ~

 

input은 이 여러겹의 layer를 거치면서 특성들이 뽑히면서 최종적으로 정확한 분류가 가능해진다.

 

 

위의 그림은 의자를 분류하는 5x5 filter가 32개 있는 경우이다. 

총 32개의 activation map이 생성된다. 

각 filter가 잡아내는 특성이 다른데, 필터링된 사진은 아래 회색그림으로 표현되고,

흰색 부분일수록 해당 필터로 필터링했을 때 필터의 특성이 높은 부분(activation이 높다)을 의미한다.

  • 파란 박스를 보면, 주황색 특성을 잡아내고 있다.
  • 아래 회색 그림에서 의자의 주황색부분의 위치가 흰색으로 보인다.

 

Stride

위에서 보았듯이 이미지의 특징을 찾기 위해 사용하는 파라미터를 필터라고 한다. 

이 필터는 정사각 행렬이고, 깊이는 입력데이터와 같아야 한다.

이 필터를 입력데이터 위에서 빈곳이 없도록 이동해가면서 같은위치 원소끼리 곱해 서로 더하는 합성곱을 수행하고, 컬러사진이라면 3개의 RGB 채널(depth=3)에 대한 합성곱결과를 모두 더해 행렬형식으로 출력된다.

이 때 필터가 한번에 이동하는 칸의 수가 Stride이다.

 

 

Stride는 입력데이터에서 버려지는 픽셀이 없도록 설계돼야 한다.

  • 이 때 (N - F)/stride   (N = 입력데이터이미지의 가로or세로크기,  F = 필터 가로or세로크기) 가 나누어 떨어지는 수를 stride로 설정한다.

  • 출력 데이터 크기 : {(N - F) / stride} +1 

일반적으로 CNN에서 stride = 1으로 진행한다.

 

Padding

Padding이란 입력데이터가 합성곱의 결과로 크기가 줄어들면서 데이터의 특성이 손실되는 것을 막고자, 입력데이터의 주변에 임의로 추가 픽셀을 둘러주는 것을 말한다.

 

 

5x5 필터로 32x32 입력데이터에서 합성곱을 진행할 경우, (N-F)/stride  + 1 에 의해 한 번에 크기가 4씩 줄어들게 된다. Convolutional layer를 거칠 때마다 크기가 줄어 결국 이미지가 사라지게 된다.

 

 

 

 

 

 

7X7 input에 3x3 필터, stride = 1로 적용한다고 가정해보자.

이 때 padding 을 가장자리에 1 픽셀씩 두른다고 했을 때, 출력데이터 크기는 얼마일까?

  • 출력데이터 크기 = (N-F)/stride +1

  • Padding으로 input의 가로크기는 N + 2이다.

  • ((7 + 2) -3) / 1   +1 = 7로 7x7 사이즈가 유지된다.

padding은 주로 0을 이용하는 zero padding을 한다.

 

 

예시타임

1)  32 x 32 의 입력데이터에 5x5 필터 10개를, stride =1, pad =2로 적용했을 때 출력데이터의 크기는?

  • ((32 + 2x2) - 5) /1  +1  = 32로 필터를 적용해도 가로x세로 크기는 변하지 않아 32x32이다.
  • 32x32x1의 activation map이 10개 쌓여 최종 32x32x10 이 된다.

 

2) 위의 문제에서, 총 parameter의 개수는?

 

  • parameter는 수정해나갈 값이다. 
  • 하나의 필터에는 5x5x3 개의 weights가 있고, 거기에 +1 bias로 총 76개의 parameter가 있다.
  • 필터가 총 10개니 760개의 parameter가 있다.

요약

  • 입력데이터크기 : W1 x H1 x D1
  • Hyperparameters
    1) 필터 개수 K
    2) 필터 크기 F
    3) Stride S
    4) zero padding P
  • 출력데이터크기 : W2 x H2 x D2
    - W2 = H2 = (W1 - F + 2P)/S  +1
    - D2 = K
  • Parameters의 개수 = (FxFxD1)xK + K 
    ∵ 필터의 depth = 입력데이터의 depth (D1) 

⭕ 일반적인 셋팅

 

 

 

 

 

 

 

=> 일반적인 Hyperparameter 셋팅은 이렇다.

 

 

=> F =1 인 셋팅이 있는데, 필터크기가 1이면 Padding이 0이어도 입력데이터의 크기가 유지된다.

 

 

실행 예시

Torch라는 프레임워크에서의 실행 예시이다.

뉴런과 parameter sharing

입력데이터를 하나의 필터가 이동하며 합성곱을 진행할 때, 한 위치에서의 합성곱이 이루어지는 과정을 하나의 뉴런으로 빗대어볼 수 있다. 한 위치에서의 입력데이터와 그에 해당하는 필터의 원소간 곱을 모두 더해 bias를 더한 값이 해당 뉴런의 출력값이 되고 모든 뉴런들의 출력값이 모여 activation map으로 최종 출력데이터를 형성한다.

 

만약 필터가 5개라면, 왼쪽 빨간박스의 activation map이 오른쪽 파란박스처럼 5층으로 쌓이게 된다.

  • 왼쪽 빨간박스처럼 같은 층의 activation map 내의 뉴런들은 같은 parameters (weights)를 공유한다. (= 같은 필터)
  • 오른쪽 파란박스는 같은위치의 입력데이터에 대한 출력뉴런이지만, 서로 다른 activation map에 속하므로, 다른 parameters를 공유한다. (= 다른 필터)

 

2. Pooling layer

 

이제까지 CNN에서 Convolutional layer를 살펴보았다. 이 때는 입력데이터의 특성을 유지하기 위해 데이터 크기를 유지하는 것에 신경을 썼다면, Pooling layer는 특성을 잃지 않고 데이터 크기를 조정하는 역할을 한다.

Pooling의 방법은 Max pooling, Average pooling 등 다양하지만 가장 흔하게 Max pooling을 사용한다.

 

 

 

  • Max pooling : 크기별로 필터를 취해, 필터의 영역 안에서 가장 큰 값을 취해 downsampling을 한다.
  • 출력데이터의 각 값들이 실제 입력데이터에서 정확히 어디에 위치해 있는지에 대한 정보는 손실되지만, invariance(불변성)을 얻는다. 여기서 invariance란, 입력의 위치가 변해도 출력은 변하지 않는다는 것인데, 왼쪽 그림에서 downsizing한 출력데이터의 각 값들이, 원래의 입력이미지에서 중요한 특성들을 나타내는 값들이라면, 실제 입력데이터의 물체의 위치가 조금 변해도, 어느정도 범위안에는 특성값이 위치할 것이므로, pooling layer의 출력값은 유지된다는 것이다. 강아지가 어디에 있든 강아지라고 판단할 수 있는 것이다. 

 

요약

 

일반적으로 F = 2, S = 2로 하여 2분의 1로 downsizing한다.

 

3. Fully Connected Layer

 

CNN의 마지막 층인 FC layer에서는 이전의 데이터를 1차원 벡터로 펴주고

가장 마지막에 Softmax에서 클래스를 구분하게 된다~

 


요약

CNN의 구성

1. Convolutional Layer : 필터와 입력데이터의 합성곱을 이용해 입력데이터의 특성을 추출

- Filter : depth는 입력데이터와 동일하게 유지. 입력데이터와 dot연산을 진행하여 모두 더한 값의 집합을 activation map으로 출력

- Stride : Filter가 한번 이동하는 칸수

- Padding : Convolution 시행시 데이터 크기를 유지하기 위해 입력데이터의 주변에 두르는 픽셀

 

2. Pooling layer : 데이터의 크기를 줄이는 층

- 주로 Max pooling을 이용하고, Filter 안에서 가장 큰 입력데이터의 픽셀값을 뽑아 출력하게 됨.

- 입력데이터의 위치가 조금 변해도, 출력값이 유지됨

 

3. Fully Connected Layer : 위의 결과를 1차원 벡터로 펴서 Softmax함수에 넣어 클래스를 구분

 


출처

www.youtube.com/watch?v=bNb2fEVKeEo&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv&index=5

댓글