Convolutional Neural Networks
입력을 나누어받는 고양이의 뉴런에서 착안하여 입력을 나눠 받아보자고 시작한 것이 Convolutional Neural Networks이다.
이미지를 나누어서 입력을 받는다고 하였을 때 아래와 같이 볼 수 있다.
입력을 자른 후 각각의 입력으로 넘기게 되는데 이 층을 Convolutional Layer라고 부른다. 그래서 전체의 이름이 Convolutional Networks라고 부른다.
만들어진 Convolutional Layer 사이에 RELU나 POOL을 넣어 계산한다. 이와 같이 CONV 레이어와 RELU, POOL을 반복하고 마지막에 FC을 구성하여 최종적인 Labeling을 할 수 있다.
**POOL과 RELU는 어떤 층이었지? 이 층이 레이어 사이에 넣어질 때 규칙이 있는 건가? POOL의 개수가 적어보이는데 어떤 이유가 있는거지?
레이어별로 어떻게 진행되는지 알아보자.
입력을 이미지로 받는다고 했을 때, 이미지는 다음과 같이 나타낼 수 있다. width * height * depth는 이미지를 vector의 형태로 나타낸 것인데, depth는 color 값을 나타낸다.
Conv에서는 이미지를 하나의 입력으로 받지 않고 이미지를 작게 나눠서 단위별로 처리한다. 이때 지정된 단위별로 처리하는 것을 filter라고 한다(filter 크기를 지정할 때, width와 height의 값은 사용자의 설정에 따라 달라질 수 있으나 depth는 색의 값이므로 변하지 않는다.).
여기서는 5 * 5로 값을 지정하고 5 * 5로 이미지를 읽어낸다. filter는 아래의 그림과 같이 5 * 5로 지정된 단위만큼을 읽어온 후, 수학적 처리에 의해 한 점만 뽑아낸다.
어떻게 한 점으로 만들 수 있을까?
그동안 배웠던 Wx + b를 통해서 만들 수 있다. 읽어온 값(5 * 5 * 3)을 x라 하고 Wx + b의 식에 대입하여 값을 만들 수 있다(Wx + b는 x가 1개일 경우나 여러 개(feature의 개수)일 경우에 대해서도 계산할 수 있기 때문에 유용하게 사용할 수 있다.).
여기서 W이 한 점으로 처리하는데 큰 영향을 미치기 때문에 W를 filter의 값이라고 생각하면 된다. 여기서 ReLU의 값을 넣어주고 싶으면 ReLU(Wx + b)와 같이 기본 식에 ReLU를 포함하면 된다.
** ReLU가 뭐였더라.. 그냥 식인가 그래프인가. 알고리즘인가..
같은 filter(W)를 가지고 이미지를 계산해보자.
이런 과정을 거치게 되면 우리는 몇개의 값을 모을 수 있을까? 이 부분이 중요한 이유는 네트워크를 구성할 때 이 값을 알아야 W의 개수도 정하고 어떻게 넘길 것인가도 설계할 수 있다.
다음 예제를 통해 알아보자.
7 * 7 input을 3 * 3 filter를 가지고 움직이면 몇 개의 점이 나올까?
** 왜 한칸씩 움직이지?
filter를 한 칸씩 움직이는 것을 Stride 1이라고 한다. 그러므로 위와 같이 움직이는 것을 Stride 1일 때, 총 5 * 5의 점을 뽑아낼 수 있다고 하면 된다.
Stride를 2라고 잡으면 아래와 같다.
Stride 2일 때, 3 * 3 output을 낸다.
이것을 일반화해보면 Stride 와 이미지의 크기를 통해 output의 값을 알아낼 수 있다(output을 알아내면 W의 개수도 정하고 어떻게 넘기는지 설계할 수 있다.).
위의 설명한 것과 같이 이미지를 축소시키면 입력값을 나눠서 받게 되고 **계산하기 좋은 값이 된다. 하지만 이미지를 축소하게 되면 정보를 잃어버리게 된다는 단점이 있다.
그래서 보통 Conv을 이용할 때는 padding이라는 개념을 사용한다. idea는 이미지의 테두리에 0의 값을 가지는 픽셀 테두리를 만들어주는 것이다.
이 idea의 장점은
- 그림이 급격하게 작아지는 것을 방지할 수 있다.
- 이미지의 모서리를 Network에 알려줄 수 있다.
는 점이다.
pad를 넣을 경우 output의 값은 어떻게 나올까? pad를 하게 되므로 input 값은 7 * 7에서 9 * 9로 바뀌게 된다. 그 후 같은 공식으로 계산해주면
7 * 7로 나오게 된다. 이 얘기는 7 * 7의 값을 넣었을 때, 같은 사이즈로 값이 나오게 되는 것을 의미한다.
한 Conv는 위와 같이 Layer를 만드는 과정을 반복하는데, 주의할 점은 Layer 별로 새로운 filter를 사용한다는 것이다(깊이 값 = layer의 개수 = 필터의 개수).
** 28 * 28?이 어떻게 나온거지
이런 성질을 이용하여 출력의 width, height, depth 값을 모두 알 수 있다.
이런 Conv과정을 거쳐 나온 것을 Activation Map이라고 하는데, Activation Map은 다시 Conv과정을 반복할 수 있다. 여러번 이 과정을 반복하면 이런식으로 Convolution Layer가 되는 것이다.
여기서 생각해볼 수 있는 것이 얼마나 많은 weight의 variables의 개수가 얼마나 될까?
weight의 개수는 5 * 5 * 3을 6개를 사용하였으므로, 5 * 5 * 3 * 6으로 값을 구할 수 있다.
어떻게 그 값들이 정해질까?
처음에는 값을 random하게 초기화하고 가진 데이터로 학습을 하게 된다.