본문 바로가기
ML & DL/CS231n (Stanford Univ.)

[CS231n] Lecture 5 | Convolutional Neural Networks

by 남르미누 2020. 11. 14.

 

이번 강의에서는

Convolutional Neural Network(CNN)가 어떻게 작동하는지를 살펴볼 것이다.

 

Fully Connected Layer에서 하는 일은

어떤 벡터를 가지고 연산을 하는 것이다.

activation은 이 layer의 출력이다.

 

 

기존의 FC layer가 입력이미지를 쭉 펼쳤다면

이제는 기존의 이미지 구조를 그대로 유지하게 된다.

 

그리고 filter가 우리의 가중치가 되는 것이다.

filter를 가지고 이미지 슬라이딩을 하면서

공간적으로 내적을 수행하게 된다.

 

 

여기서 깊이(depth)는 3이다.

깊이는 전체 깊이를 전부 취하지만, 32x32중 5x5만을 취한다.

필터의 각 W와 이에 해당하는 이미지의 픽셀을 곱해준다.

 

각 원소끼리 Convolution을 하는 것과

그것을 쭉 펴서 내적을 하는 것이나 똑같은 작업을 하는 것이다.

 

 

Convolution은 이미지의 좌상단부터 시작하게 된다.

그리고 필터의 중앙을 값들을 모으게 된다.

 

필터의 모든 요소를 가지고 내적을 수행하게 되면 하나의 값을 얻게된다.

 

그리고 슬라이딩하게 된다.

 

Conv연산을 수행하는 값들을 다시 ouput activation map의 해당하는 위치에 저장하게 된다.

 

입력 이미지와 출력 activation map의 차원이 다르다는 것을 확인할 수 있다.

 

입력은 32x32이고 출력은 28x28이다.

 

 

여러 개의 필터를 사용하면 여러가지의 activation map들을 얻을 수 있다.

 

 

각 layer의 출력값은 다음 layer의 입력값이 된다.

 

각 layer는 여러개의 필터를 갖고 있고 각 필터마다 각각의 출력 map을 만든다.

 

그러므로 여러개의 layer들을 쌓고나면

결국 각 필터들이 계층적으로 학습을 하는 것을 보게 된다.

 

Conv, ReLU 반복하다가, 가끔 pooling을 거치고

마지막 끝단에 FC-layer를 거친다.

 

pooling은 activation maps의 사이즈를 줄이는 역할을 한다.


 

level이 높아질수록 더 많은 특징을 담아낼 수 있다.

 

layer의 계층에 따라 단순 또는 복잡한 특징이 존재한다.


지금까지는 슬라이딩을 한 칸씩 진행했다.

 

이 때 움직이는 칸을 바로 "stride"라고 한다.

 

즉, 지금까지는 stride=1 을 사용했다.

 

 

stride가 input 이미지에 맞지 않으면 불균형한 결과를 부를 수도 있다.

 

 

Output size

= ((input size - filter size) / stride) +1

 

 

 

Zero-padding : 가장자리의 필터 연산을 수행하도록 한다.

이는 입력의 사이즈를 유지하기 위함이다.

 

Zero-padding을 하면 새 출력이 7이 된다.

 

즉, 출력의 차원이 입력의 차원과 같아진다.

 

출력 = (7 x 7 x '필터의 개수')

 

Zero-padding 하지 않았을 때 layer가 쌓이게 되면 사이즈는 급속도로 줄어들게 될 것이다.

그러면 activation map이 작아지게 될 것이다.

이는 우리가 원하는 결과가 아니다.


 


 

 

Layer의 파라미터 갯수는 위와 같이 구한다.

 

필터의 사이즈 5x5 와 입력의 깊이 3 그리고 Bias term 1의 합을 계산하고

이러한 필터가 10개가 있으므로 760개가 답이 되는 것이다.


 

Conv layer를 요약정리한 것이다.

 

어떤 n차원의 입력이 있다.

그리고 어떤 필터를 사용할지 선택해야 한다.

몇 개의 필터를 사용할건지, 필터의 크기는 몇인지,

stride는 몇으로 할건지, zero-padding은 몇으로 할건지를 다 정해줘야한다.

 

그리고 앞서 말한 수식을 이용해서

출력의 사이즈가 어떻게 될 것인지를 계산해본다.

 

그리고 전체 파라미터가 몇 개가 될 것인지도 확인을 해봐야 한다.

 

여기에는 일반적으로 사용하는 값들이 나와있다.

필터 사이즈는 3x3, 5x5를 사용한다.

stride는 보통 1이나 2를 사용한다.

padding은 그 설정에 따라 조금씩 달라질 것이다.

필터의 갯수는 2의 제곱수인 32, 64, 128, 512와 같은 수로 설정한다.


 

 

Conv layer의 출력이 작을수록, 그리고 stride 값이 커질수록

FC layer에서 필요한 파라미터의 수가 작아질 것이다.

이는 과적합(overfitting)과 연관이 있다.

 

"Receptive field"란 한 뉴런이 한 번에 수용할 수 있는 영역을 의미한다.

이는 filter의 사이즈와 같다.

 

예를 들어, 5x5 필터가 있다고 해보자.

한 뉴련의 "Receptive field"가 5x5이다라고 할 수 있다.


 

Pooling layer가 하는 일은 downsampling을 하는 것이다.

즉, Pooling layer는 Representation들을 더 작고 관리하기 쉽게 만들어 주는 것이다.

 

작아지면 파라미터의 수가 줄어들게 된다.

공간적인 불변성을 얻을 수도 있다.

중요한 점은 "Depth"는 건들지 않는다는 것이다.

따라서 Depth에는 영향을 주지 않는다.


 

Max Pooling이 일반적으로 사용된다.

 

Pooling에도 필터의 크기를 정할 수 있다.

얼마만큼의 영역을 한 번에 묶을지를 정하는 것이다.

 

겹치지 않는 새로운 영역내에서 가장 큰 값을 골라내서 downsampling을 한다.

(대신, 내적을 하는 것이 아니다.)

 

값이 크다는 것은 특징을 그만큼 잘 나타내고 있다는 것이기 때문이다.

값들은 이 뉴런이 얼마나 활성화되었는지를 나타낸다.

 

즉, 이 필터가 각 위치에서 얼마나 활성되었는지이다.

 

Max pooling은 그 지역이 어디든, 어떤 신호에 대해

"얼마나" 그 필터가 활성화 되었는지를 알려준다고 할 수 있다.

 

우리가 "인식"에 대해 생각해보면

어느 정도의 직관을 얻을 수 있는데,

 

그 값이 어디에 있었다는 것보다는

그 값이 얼마나 큰지가 중요한 것이다.

 

Pooling 할 때는 padding을 고려하지 않아도 되고

그저 downsampling만 하면 된다.


 

우리는 지금 Conv layer를 배우고 있다.

 

ReLU layer는 지난 강의에서 했던 것과 같다.

 

그리고 downsampling을 하고 싶을 때는 pooling을 섞어준다.

 

그리고 마지막에는 FC layer가 있다.

 

위의 마지막 Conv layer의 출력은 3차원 volume으로 이뤄진다.

 이 값들을 전부 펴서 1차원 벡터로 만든다.

그리고 이를 가지고 FC layer의 입력을 사용한다.

 

그렇게 되면 Conv net의 모든 출력을 서로 연결하게 되는 것이다.

 

이 마지막 layer부터는 공간적 구조를 신경쓰지 않게 된다.

 

전부 다 하나로 통합시키고는 최종적인 추론을 하게 된다.

 

그렇게 되면 Score가 출력으로 나오게 되는 것이다.


마지막으로 요약하자면 다음과 같다.

 

이번 강의를 통해서 CNN이 어떻게 동작하는지를 배웠다.

 

기본적으로 Conv와 Pool을 쌓아 올리다가

마지막에 FC layer로 끝나게 된다.

 

그리고 네트워크의 필터는 점점 더 작아지고,

아키텍쳐는 점점 깊어지는 경향을 배웠다.

 

그리고 Pooling이나 FC layer를 점점 더 없애는 추세이기도 하다.

그냥 Conv layer만 깊게 쌓는 것이다.

 

전형적인 CNN 아키텍쳐는 Conv와 ReLU를 몇 번 (n번) 반복한다.

그리고 그 중간에 pooling도 몇 번 들어간다.

그리고 FC layer가 이어진다.

한 번에서 두 번 그 이상일수도 있다.

 

그리고 class score를 구하기 위해 softmax를 사용한다.

 

일반적으로 n은 5 정도가 될 수 있다. (= 5번 반복)

 

그렇게 되면 엄청 깊은 Conv, ReLU, Pool 시퀀스를 구성하게 될 것이고,

그 다음 한두 번의 FC layer가 이어지는 것이다.

 

오늘은 여기까지 :)


(참고자료)

 

leechamin.tistory.com/search/cs231n

 

참신러닝(Fresh - Learning)

이차민의 iOS/ML/DL 공부 블로그 Computer Vision과 iOS개발에 대한 전반적인 공부를 합니다. "Be The First Penguin"

leechamin.tistory.com

lsjsj92.tistory.com/

 

꿈 많은 사람의 이야기

안녕하세요. 이수진이라고 합니다. 이 블로그는 AI(인공지능), Data Science(데이터 사이언스), Machine Learning, Deep Learning 등의 IT를 주제로 운영하고 있는 블로그입니다.

lsjsj92.tistory.com

taeyoung96.github.io/categories/CS231n/

 

CS231n Summary

한 발자국씩 앞으로 나아가자

taeyoung96.github.io

 

댓글