이번 포스팅은 cs231n의 5강을 정리한 글입니다.
이번 장에서는 컨볼루션 뉴런 네트워크( convolutional neural networkds)를 배우게 됩니다.
그럼 바로 시작해볼까요!
이거는 뭐 cs231n에서 진행하는 과제(assignment)와 관련된 장입니다.
우리는 지난 시간에는 단순한 linear score를 배웠습니다.
f = wx이죠
그리고 만약 2-layer가 된다면 W2max(0, W1x) 이런식으로 된다고 했고
이렇게 하면 hidden layer가 추가된다고 했습니다.
이제 우리는 컨볼루션 뉴런 네트워크에 대해서 배우게 될 것입니다.
convolutional nerual network 속칭 CNN은 이미지 인식에서 정말 많이 사용합니다.
그럼 이 CNN이 발전되기 까지 딥러닝의 역사는 어떻게 되었을까요?
CNN에 들어가기 전에 딥러닝에 역사에 관해 살펴봅시다.
맨 처음 시작은 mark 1 perceptron이라는 것이었습니다.
단순히 기계로 동작했고 일반적인 단층 퍼셉트론 방식이었습니다.
w값들을 조절해가면서 train 시켰죠
그 다음 adaline(아달라인)/madaline이 나오게 됩니다.
이때까지만 해도 오차역전파(backpropagation) 등이 없어서 기계로 숫자를 조절해가면서 진행했죠
오차역전파 라는 back-propagation 개념은 1986년도에 나오게 됩니다.
하지만 이때도 인기는 끌지 못했죠
이렇게 점차 발전해나갔습니다
2006년에는 hinton 교수님께서 weight를 잘 줄 수 있는 방법(RBM-initialized)과 fine tuning 방법을 사용하는 방법에 대해서
나오게 되었죠. 그렇게 먼 과거가 아니죠? 2006년도면.. 불과 12년 전입니다.
그러다가 2012년 딥러닝이 확! 뜨는 계기가 있었습니다.
불과 6년전이죠. 그것은 image net에서 alex krizhevsky가 제시한 알렉스 넷에서 터지게 되었습니다.
image net에서 사람보다 더 뛰어나게 인식할 수 있도록 딥러닝을 이용해 이미지를 구별해냈죠
이때 사용한 방법이 CNN이고 이떄부터 급격히 발전하게 됩니다.
그럼 CNN은 처음에 언제 소개되었을까요?
강의 초반에 고양이 이미지 실험 내용이 있었던 것 기억하시나요?
이게 CNN의 시초입니다.
1959년에 나오게 되었죠
그래서 어떤 것을 볼떄마다 활성화 되는게 다르고 등등을 분석해서
이걸 적용시킨 것이 CNN이 됩니다
여기서 보시는 바와 같이 큰 것 부터 -> 섬세한 영역까지 들어가게 됩니다.
이런 아이디어가 합쳐지면서 CNN이 탄생하게 되죠
그리고 lecun 등이 소개한 lenet에서 cnn이 제대로 적용됩니다.
이건 위에서 소개한 큰 것 -> 섬세한 영역으로 들어가는 것과도 일치했죠
이후에 발전되서 나온 Alexnet도 마찬가지로 큰것 -> 섬세한 것으로 특징을 추출해냈고
그 결과 image net에서 엄청난 정확도를 보여주게 됩니다.
이렇게 CNN은 현재 엄~청나게 많이 사용되고 있습니다.
단순한 구분에서
컴퓨터 비전(computer vision)영역에서 사용되는 detection, segmentation 등도 CNN으로 함께 사용할 수 있죠.
지금은 그래서 잘하시는 사람들이 opencv와 cnn을 함께 이용해서 이미지를 학습시키고 있죠
자율 주행 자동차에서도 마찬가지입니다.
테슬라는 더욱이 gpu까지 넣어서 엄청나게 빠른 속도로 탐지하죠
그래서 관절영역, 은하계, 표지판 탐지 등 이런 것들에 전부 cnn이 사용되고 있습니다.
이렇게 많이 사용되는 CNN!정말 핫하죠
이게 cs231n 강의에서 사실상 핵심입니다.
왜냐하면 영상인식이라는 주제이기 때문이죠!
자 이제 본격적으로 들어가봅니다
우리는 과거에 단순히 input image를 쫙! 늘려서(stretch) wx에 넣고 탐지했습니다.
하지만 앞에서 보았듯이 이 방법은 썩 좋지 않습니다.
말머리가 2개가 나온다거나 그런 문제가 있었죠
그래서 이 방법을 아래와 같이 바꿉니다.
만약 RGB color로 한다고 가정합니다. ( grey 계열이면 depth가 1) 그러면 depth가 3이겠죠?
거기에 width, height가 각각 32x32입니다. 즉 총 32x32x3이 되겠죠
여기에 convolve filter를 둡니다. 이 필터를 이용해서 저 input의 이미지에서 특징을 뽑아낼 것입니다.
filter는 5x5x3의 모양입니다. 여기서 depth가 3이기 때문에 얘도 3의 모양을 가지고 있는 것입니다.
여기서 설명이 나오네요 ㅎㅎ
depth는 같아야 합니다
그래서 이 필터를 가지고 하나의 지역에 대해 하나의 값을 뽑아냅니다. 필터가 w라고 하면 w의 전체 값과 곱하기 x그리고 bias를 더합니다.
그리고 이 값들을 다 더하면 하나의 값이 나오게 되죠!
자세한 원리는 뒤에서 나오게 됩니다.
그래서 32x32x3 이미지에 5x5x3 convolve filter를 거치게 되면 28x28x1의 하나의 activation map이 나오게 됩니다.
즉 얘내는 5x5x3filter를 거쳐서 특징이 뽑아내진 하나의 '층'이 됩니다.
그럼 필터를 1개만 쓸까요? 아닙니다. 여러개의 필터를 사용합니다.
만약 다른 필터를 사용하게 되면 이렇게 초록색의 필터가 하나 더 나오게 될 것입니다.
6개의 filter를 사용하게 되면 6개의 activation maps가 나오게 되죠!
여기서 이제 depth가 바뀌게 됩니다.
6개니까 28x28x6이 되죠!
자 이렇게 1번 거쳤습니다.
그리고 하나 더 둡니다.
이번에는 filter가 5x5x6 filter가 10개인가 보죠?
그래서 output이 24x24x10이 나오게 됩니다.
이런식으로 계속 이미지의 특징을 추출해나가는 것이죠
실제로 이렇게 시각화를 해보면 위와 같이 나온다고 합니다.
첫 번째 계층을 보면 색상, edge등 각 영역마다 다양한 모양을 가지고 있습니다.
그리고 아래층을 가면 갈 수록 더 자세한 영역까지 다루는 것을 볼 수 있죠
이게 CNN의 힘입니다
이건 마치 과거의 연구에서 큰 영역 -> 섬세한 영역으로 더 파고들어서 한다는 이론과
일맥상통합니다.
그리고 실제 자동차 앞부분을 보시면 위 처럼 나오게 됩니다.
아까 하나의 필터는 하나의 activation map을 만든다고 했죠?
위의 작은 사진이 filter들입니다. 그리고 아래 activation map이 있죠. 이거를 다 시각화 해본 것입니다.
예를 들어 파란색 화살표의 경우 filter를 보니 주황색을 얘가 filter로 선택했죠?
activation map을 보니까 주황색 부분만 밝게 칠해진 것을 볼 수 있습니다.
이게 filter에 따른 activation map이 다르게 나와서 각 filter들이 각 특징을 추출해내는 것을 볼 수 있습니다.
우리는 이제 위와 같은 층을 배우게 됩니다.
지금 conv를 배웠고 이제 이 층에서 나온 값들이 ReLU의 활성화 함수(activation function)을 거쳐서 pooling을 만나고 ..
쭉쭉 나가게 될 것입니다.
근데 궁금하지 않으세요?
이 사진은 아마 많은 분들이 CNN을 기본적으로 검색해보셨다면 많이 보신 사진일 겁니다.
왜 검정색 또는 회식만 있을까???
ReLU를 거치니까 검정색으로 되죠?? ReLU는 0이하의 값들을 전부 0으로 만듭니다. 즉 -값들이 전부 없어지죠.
그래서 검정색이 됩니다 ㅎㅎ
ReLU하기 전에는 -값을 하지 않으니까 회색까지 포함되어 있는 것입니다.
그리고 여기서는 RGB depth를 전부 포현한게 아니라 이 중 하나의 depth만 가져와서 보여주기 때문에 grey 계열로 나오게되죠!
뭐 아무튼 ㅎㅎ
우리는 이 filter를 통과하면 activation map이 나온다는 것을 보았습니다.
그럼 이게 어떻게 나올까요?
간단히 보아서 7x7의 input과 3x3 filter가 있다고 해봅시다.
depth가 3이라면 똑같이 3을 그냥 곱해주면 됩니다.
여기선 간단히 보이기 위해서 이렇게 합니다.
그럼 이 filter가 옆으로 쭉쭉 옮겨 가면서 값을 하나하나 뽑아낼 것입니다.
여기서 값이 하나 나오게 될 거고
여기서도 값이 하나 더 나오게 될 것입니다.
또 나오게 되겠죠?
이렇게 7x7에서 3x3filter가 움직일 수 있는 거리는 5번입니다. 세로도 마찬가지겠죠?
그래서 output은 5x5가 나왔던 것입니다!
그래서 32x32에서 5x5필터를 이용하면 28x28이 나왔던 이유가 이거 때문이죠!
근데 여기서는 stride가 1이었습니다.
stride는 옆으로 움직이는 값?이라고 말해야 하나
뛰어넘어갈 수 있는 수치를 뜻합니다.
만약 stride가 2면 어떻게 될까요?
아래처럼 됩니다.
2칸씩 뛰어넘어가죠?
즉 앞에선 1칸씩 뛰어넘어간 것이고 이젠 2개씩 뛰어넘어가게 됩니다.
그러면 여기서 어떻게 되냐?
당연히 2개씩 뛰어 넘어 가니까 output 값이 작아지겠죠?
이런 특징을 가지고 있습니다.
그럼 stride가 3이면 어쩌나??
fit하지 않을 겁니다. 3개로 하면 전부 다 둘러볼 수 없기 때문이죠.
그래서 이걸 일반화 공식으로 살펴보면
N은 input size입니다. F는 filter의 크기이구요.
(N-F) / stride + 1의 값이 바로 output의 size가 됩니다. 이게 딱 떨어지지 않으면 나오지 않는 것이구요.
그래서 N이 7일때 F가3이면 stride가 1이면 5, 2이면 3이 나왔던 겁니다!
여기서 padding 개념이 나옵니다. 이게 이미지가 저렇게 stride를 거칠 수록 계속 사이즈가 작아지게 됩니다.
이게 이미지가 급격히 작아지게 되면 cnn층을 몇개 쌓지도 않았는데 금세 image가 없어지게 됩니다.
또한, 중간에 있는 영역들은 filter들이 중복해서 겹쳐서 보게 됩니다. 근데 양쪽 side는 중간에 비해서 좀 덜 보게 되죠?
왜냐면 side는 filter가 1번뿐이 보질 못합니다. 이게 조금 문제가 될 수도 있죠
가장 큰 문제는 image size가 작아진다는 것입니다.
그래서 padding 개념이 나옵니다. 여기서는 zero padding을 통해 양쪽 사이드에 zero값을 둘러줍니다.
즉 padding을 1개 추가 하게 되면 왼쪽+오른쪽이 되니까 x2가 됩니다.
즉 7x7 이미지가 9x9가 되죠.
padding이 2개 layer가 추가 되면 어떻게 될까요? 2x2=4의 숫자만큼 증가되어 11x11이 되겠죠?
자 그럼 위에서 이렇게 padding을 1개 추가하면 output은 어떻게 될까 물어봅니다.
어떻게 될까요?
7x7이 나오겠죠. 왜냐하면 이미지 크기가 9x9로 커졌으니까요. (9-3)/1 + 1하면 7이 나오잖아요?
그래서 일반적으로 filter가 3이면 zero pad을 1개만하고
filter가 5면 zero pad를 2개를 한다 이런 말입니다.
일반적으로 이렇게 사용됩니다.
앞으로 돌아가서 보면 padding을 써줘야 이미지 크기가 급격히 줄어드는 것을 방지할 수 있다고 합니다
여기서 문제!
32x32x3의 input에 5x5 filter 10개와 stride1, pad가 2이면 어떻게 될까?
32x32x10이 되겠죠?
ㅎㅎ 간단히 계산해보시면 알겁니다.
그럼 파라미터 개수는 얼만큼 필요할까요?
760개가 될 것입니다. 왜냐하면
5x5x3은 75죠? 이게 10개가 있으니까 750입니다.
근데 bias값이 각 필터마다 있으니 + 10을 하게 됩니다. 그래서 760이 나오게 되죠
그래서 일반화를 하면 위와 같이 나온다고 합니다. 뭔가 영어가 쓰여져 있고 수학처럼 쓰여져 있디고 해서 무시하지 마시구
앞에서 배웠던 내용을 summary한 것입니다.
천천히 보시면 됩니다 ㅎㅎ
그래서 보통 input이미지는 32, 64, 128 등 2의 지수승으로 가게 되고
Filter가 3이고 stride가 1이면 padding1,
Filter가 5이고 stride가 1이면 padding은2 이런식으로 쓰여진다고 하는 것입니다.
그리고 1x1 conv 내용이 나옵니다.
이거는 앞에서 본 5x5 이런식이 아니라 1x1을 사용한다고 합니다.
이게 나중에 CNN을 거치고 나서 Flatten()을 합니다.
즉 쫙 핀 다음에 이걸 이제 input으로 Fully Connected layer에 넣게 되는데요
이떄 이 FC를 빼고 1x1 CONV를 써도 상관없다고 합니다. 연산이 똑같다고 하는 군요.
그래서 뭐 토치에서는 이렇게 된다고 하구요
caffe에선 이렇게 된다고 합니다.
그래서 하나의 filter에 대한 영역에서 1개의 숫자가 나오게 되는데 이건 뉴런에서 local connect와 비슷하다고 합니다.
그래서 만약 5개의 필터면 같은 영역에 대해 5개의 값들이 나오게 됩니다
이렇게 말이죠. 하지만 5개는 각각 다른 특징을 가지고 있겠죠?
필터가 다르니까요
즉 '같은' 영역에서도 필터가 다르니까 서로 다른 값들을 뽑아내는 것입니다.
그래서 fully connected layer에선 이렇게 된다고 합니다.
이제 우리는 Pooling만 배우면 됩니다
pooling은 이미지의 사이즈를 줄여줍니다. 근데 여기서 큰 특징값을 유지하면서! 줄여주는 것이죠
그래서 보통 max pooling을 많이 사용합니다.
max pooling은 큰 값을 뽑아내는 것인데요
'큰 값'이라는 것은 그 '특징'의 값이 크다라는 것입니다.
즉 매우 튀는 특징 값을 뽑아내고 나머지는 버립니다!
이렇게 말이죠
max pool이 2x2면 크기가 절반으로 줄어듭니다. 여기서 빨간색 영역은 6, 초록색은 8이 제일 크니까
이 값들을 뽑아내는 것입니다.
이렇게 해서 이미지의 사이즈를 줄여줍니다.
즉 stride로 줄여나가는게 아니라 max pooling을 이용해서 이미지의 size를 줄여주는 것이죠.
마찬가지로 summary하면 이렇게 된다고 합니다.
일반적으로 pooling filter가 2면 stride가 2, 3이여도 2를 사용한다고 합니다.
그리고 마지막에 이제 FC layer로 넣어줘서 값들을 분류하게 되는 것이죠!
자 여기까지가 cs231n 2017 5강 내용이었습니다.
슬슬 내용이 어려워집니다
수고하셨습니다!
'deep learning(딥러닝)' 카테고리의 다른 글
cs231n 2017 강의 7강 training neural networks part2 정리 (2) | 2018.11.26 |
---|---|
cs231n 2017 강의 6강 training neural networks part1 정리 (0) | 2018.11.23 |
cs231n 2017 4강 정리 backpropagation and neural networks (0) | 2018.11.06 |
cs231n 2017 3강 정리 loss functions and optimization (6) | 2018.10.31 |
파이썬 케라스(keras) 딥러닝 CNN으로 강아지 종류(품종)을 예측해봅시다! (123) | 2018.10.01 |