Convolutional Neural Networks

김기범·2022년 11월 17일
0

cs231n

목록 보기
5/5
post-thumbnail

-공부를 위한 글 작성임

Fully Connected Layer


fully-connected layer에서는 [32x32x3]의 입력 이미지를 [3072x1]의 1차원으로 만들어 weight와 곱해준다. weight는 [3072x10] (input image x class num)의 크기이다.

입력 image를 1차원으로 펴서 사용하는 fully-connected layer의 단점
1. 지역적 연결성(local connectivity): 이미지의 지역적 정보를 사용할 수 없다
2. weight 수에 따른 overfitting: class가 많아지면 weight의 수가 많아져 overfitting 문제가 발생

Convolutional Neural networks


위의 사진은 CNN의 기본 구조이다.

합성곱 신경망(convolution Neural Network, CNN) 에서는 Fully-Connected(Dense) Neural Network와 달리 Neuran을 필터(filter) 혹은 커널(kernel)이라 부릅니다.

  • Kernal: 입력에 곱하는 가중치
  • filter: 뉴런의 개수

Convolution은 주로 영상 처리 분야에서 영상들로부터 특정 feature들을 추출하기 위한 필터를 구현할 때 이용하다.

2D Convolution을 알아보겠따.

Kernel은 weight의 작은 행렬을 의미한다. 이 kernel로 2D input data를 슬라이딩(sliding)하면서 요소별 곱(elementwise multiplication)을 수행하고 이를 모두 더해 하나의 output pixel를 만든다.

그리고 이 커널이 오른쪽, 그리고 아래로 한 칸씩 이동하고 있는데 stride를 1로 설정했기 때문이다. kernel은 모든 위치를 돌아다니며 해당 과정을 반복하여 2D Matrix of features를 2D Matrix of features로 변환한다.

output feature은 input layer의 output feature과 거의 동일한 위치에 있는 input feature들의 가중합(weighted sum)이 된다.

Convolutional Layer에서는 위의 그림처럼 입력 이미지의 모든 픽셀 정보와 연결되는 것이 아니라 kernel이 닫는 Receptive Field 안의 픽셀끼리만 연결이 되어서 즉, 주위의 pixel과 연결되는 것이다. 따라서 앞의 Conv Layer(Convolutional Layer)에는 low-level feature에만 집중하고, 뒤로 갈수록 high-level feature에 집중합니다.

위의 슬라이드는 VGG-16 모델을 사용한 것으로 점점 갈수록 잡아내는 특징이 고수준으로 높아지는 것을 확인할 수 있다.

Convolution layer


CNN은 위의 사진과 같이 기존의 이미지 원형을 그대로 사용한다. size는
[32(height)x32(width)x3(channel, depth)]이다. 이때 filter의 depth 또한 input image의 channel 수 만큼 확장 되어야 한다.


여기서 filter(W)의 전치행렬을 사용한 이유는 행렬 곱을 해주기 위해서이다. 가중치 행렬을 전치하여 input data x와 곱해주고 그 다음에 편향 b를 더해준다.


그래서 [28x28x1] 크기의 activatio map이 나오게 된다. 여기서는 filter의 수가 1개라고 가정한 것이다.


filter의 수가 늘어난다면 그 수 만큼 activaition map이 생긴다. 위의 경우 filter의 수를 6개로 하여 [28x28x6]의 activation map아 생겼다.

  • feature map과 activation map의 차이:
    feature map은 Convolution 연산으로 만들어진 Matrix, Activation map은 Feature Map Matrix에 Activation function 적용한 결과


위의 사진은 data를 여러 Conv layer에 통과시키는 모습이다.

padding(패딩)

padding은 Conv 연산을 수행하기 전, 입력 데이터 주변을 특정 값으로 채워서 늘리는 것을 말한다. 이는 output data의 Spatial Structure을 조절하기 위해 사용된다. padding할 때, 채울 값은 hyper parameter로 대부분 0을 사용한 zero padding을 사용한다.

padding은 Spatial Sturcture를 조절하기 위해 가장자리에 값을 채운다. 이 덕분에 가장자리의 중요한 특징을 놓치는 경우를 줄인다. kernel이 sliding하며 feature을 뽑아 activation map을 만드는데 가장자리의 경우 kernel이 많이 거치지 않아 data 반영 정도가 적지만, 중앙부의 data는 정보를 많이 반영한다. 이렇게 반영되는 정보를 차이를 줄이기 위해 padding을 하는 것이다.

stride(스트라이드)

Stride는 input data에 filter를 적용할 때 이동 간격을 조절해주는 parameter이다. stride 또한 output data의 spatial Sturcture를 조절하기 위해 사용된다.

한 가지 의문이 생길 수 있다.

stride 늘려 sliding을 하다 보면 가장 자리의 pixel이 kernel에 닿지 않는 경우가 생길 수 있다. 이 경우는 위의 슬라이드에서 볼 수 있는 것처럼 불가능하다고 나온다.

Output size

N x N의 input data를 padding과 stride를 고려하여 output size를 계산하는 식은 (NF)/stride+1(N−F)/stride+1 이다.

높이와 너비가 다르더라도 이 계산식은 동일하게 적용된다.

CNN 특징

5개의 filter를 사용했으므로 activation map의 depth가 5이다.
5개의 filter를 사용했으므로 같은 same region에서 5개의 다른 neuron 값이 나온다.
filter size가 결국 각 뉴런에 대한 receptive field이다.

  • receptive field: CNN에서 Receptive field는 각 단계의 입력 이미지에 대해 하나의 필터가 커버할 수 있는 이미지 영역의 일부를 뜻한다.

Pooling

CNN architecture에는 Pooling layer가 꼭 들어간다.

위의 사진은 stride가 2인 Pooling layer에서의 convolution이다. pooling은 subsampling이라고도 한다. 위의 사진처럼 activation function을 거쳐 나온 output map을 압축하는 역할이다.
크게 feature map의 최댓값을 뽑아내는 max pooling, 평균을 내는 average pooling을 사용한다.
224x224 feature map을 2x2 pooling을 적용하면 112x112로 줄어든다.

pooling은 convolution처럼 feature map을 스캔한다. 하지만 convolution과 달리 연산을 하는 것이 아닌, feature map을 평균 내거나 가장 큰 값을 뽑아서 사용한다. 또한 pooling은 일반적으로 겹치는 부분 없이 sliding 한다는 점이다.

기본적으로 pooling layer는 DownSampling을 하는 것이 목적이다. 아까 output size 공식처럼 Pooling의 입력, 출력 관계를 나타내면 아래와 같다.
업로드중..
depth는 동일하게 유지된다.

Summary

CNN의 기본구조이다.
업로드중..
Conv layer와 Pooling layer가 번갈아 있고 마지막 FC-layer를 통해 예측값 즉, score을 출력한다.

Conv layer에는 ReLU와 같은 activation function이 있다. 이 값을 통해 pooling 연산을 한다.
업로드중..

  1. Convolution 계산 - filter가 sliding하며 convolve
    업로드중..

  2. 각 Channel 별로 계산 후 하나의 channel 생성
    업로드중..

  3. 각 filter의 출력마다 bias가 하나씩 더해진다.

profile
대학생

0개의 댓글