[DeepLearning]Part-3 Convolutional Neural Network

Source: Deep Learning on Medium

[DeepLearning]Part-3 Convolutional Neural Network

Convolutional Neural Network(CNN)은 고양이에게 어떠한 그림을 보여 주었을 때 모든 뉴런들이 모두 다 반응 하는 것이 아니라, 일정 부분을 바라보는 뉴런이 있었고 , 즉 각자 특색을 가진 뉴런들이 존재 한다는 점을 이용한 것입니다.

기본적으로 CNN의 구조는

Convolution Layer

ReLu

Pooling

Fully Connected NN 로 이루어 집니다.

Convolution layer

고양이의 실험에서 착안했듯이, 한가지의 이미지를 다수의 filter로 이미지의 일부분만 나타내도록 잘라줍니다. 여기서 사용한 filter는 한개의 점만 뽑아 내게 됩니다.

기본적인 이해와 함께 하나의 결과치 y 를 출력하려면 Weight의 값과 input,bias 를 이용하게 됩니다. CNN에서는 이러한 Weight가 filter의 값이 됩니다. 또한 같은 filter는 동일한 형태의 weight를 갖게 됩니다.

이러한 필터들로 점차적으로 이미지를 자르는 과정을 거치는데 결국 몇개의 이미지로 자를것인가(몇개의 값이 나올것인가)는 filter의 크기와 stride에 의해 결정됩니다. 두 값 모두 사용자에 의해 정의가 가능합니다.
(stride = 이미지를 자르고 다음이미지를 만들기 위해 이동하는 크기)

filter를 지정 하였다면 Output size를 (N-F)/stride + 1 로 구할 수 있습니다.
N은 이미지의 가로세로 크기, F는 필터의 크기 입니다.

하지만 이렇게 잘라내게 되면 처음의 이미지는 여러한 layer를 거쳐 점점 작아지게 됩니다. 이를 방지하기 위해 Padding 이라는 기법을 사용합니다. Padding은 이미지 외곽을 0 값으로 둘러쌉니다.

Padding을 사용하게 되면 이미지의 크기가 필터에 의해 작아지는 값이 줄어들거나 없고, 그림의 모서리임을 나타내 줄수 있게 됩니다.

이러한 filter를 한개만 이용하는 것이 아니라, 여러개의 필터를 이용합니다.
처음 input 이미지가 32*32*3 인 이유는 32×32 의 크기를 가진이미지이고 컬러사진 이기 때문에 RGB 3 입니다. 흑백 사진이었다면 32*32*1 로 나타내 줄수 있습니다.
처음 필터의 크기 5*5는 지정해 줄수 있게 되지만 input값인 3을 갖게 되어 5*5*3인 필터가 됩니다. 이러한 필터 6개로 자르게 되면 다음 이미지는 앞서 말한 공식을이용해 28*28의 크기를 갖게되며 6개의 필터를이용해 쌓았기때문에 28*28*6이 됩니다.

Pooling

sampling 이라고도 불리우는 pooling은 앞 선 conv layer 의 이미지에서 한 layer를 추출한 후 , 작게 resize (sampling) 시키는 작업입니다. 이러한 방법을 반복하여 입력으로 주어진 conv layer 한 이미지 전체에 작업을 하게되면 작은 이미지가 나오게 됩니다.

대부분의 경우 Max Pooling을 이용하게 됩니다.
이유는 사진을 분석할 경우 특색있는 점을 이용해 결과값을 도출해 내는데,
앞선 Y 입력값에서 큰값인 부분이, 가장 특이성을 나타내는 경우이기 때문입니다.

Max pooling 또한 앞선 filter의 개념을 사용하여 resize 시키며, 한개의 필터를 적용했을 시 가장 큰값을 가져오는 방법이라서 Max pooling이라고 불리웁니다.

Modeling example
Convolution Layer, ReLu, Pooling 계층 모두 사용자의 판단에 의해 이루어지게 됩니다. 예로는 conv layer 2 번,relu, pooling 으로 이룰수도 있고, conv layer 1번, relu , pooling 으로 이룰수도 있습니다. input과 가까운 layer보다 output에 가까운 layer일수록 사진의 특이점을 잘 설명할 수 있는 사진결과로 나오게 됩니다.
마지막 Pooling 이후 나온 값을 fully connected neural network에 넣어 주기위해 flatten으로 펴준다음 FC에 넣어주어서 일정한 class를 분류하게 됩니다.

각각의 과정을 간단히 설명하자면 conv layer 와 pooling과정은 특징을 찾아내는 것이고, FC는 분류하는 작업입니다.

직접 코드를 작성하는 과정으로는 최대 10가지로 이루어 집니다.
1. learning rate,epochs,batch size와 같은 하이퍼 파라미터 설정
2. Data Augmentation — (rotate,shift 등의 방법으로 데이터 증식)
3. Data를 가져올 수 있는 pipeline 구축
4. NN model Buiding
5. Loss fuction 정의
6. Calculate a Gradient
7. Select an potimizer — adam optimizer 등
8. Define a metric for model’s performance — accuracy 등
9. Make a check point for saving — (학습도중 오류가 있을수있음)
10. Train and Validate a NN model

2번에 해당하는 데이터 증식 같은 경우에는 데이터가 터무니 없이 부족한 경우 같은 이미지를 늘리거나,회전 하는등의 방식으로 1개의 input값을 증식 시키는 경우를 의미합니다.

이 과정중에서 4번에 해당하는 Modeling 과정에서는 class를 이용한 sequential 또는 subclassing 방법을 이용할 것이냐, 함수형 코드를 이용한 functional 방법을 이용할 것인가로 나뉘어 지게됩니다.
sequential modeling의 경우 keras가 코드 순서대로 입출력값을 자동으로 관리하기 때문에 input값을 중간의 layer를 건너띄고 더해진다던가(residual) 병렬적인 layer의 형태를 만들수 없지만 functional modeling 방법을 사용하게 되면 입출력 값을 사용자가 직접 입력해 주기때문에 가능해 집니다.
subclassing 방법은 __init__ 부분에서 layer를 명시해 준다는 점에서 sequential 방법과 비슷하지만 call 하는과정속에서 직접 대입하기 때문에 사용자가 용이하게 layer의 구조를 짤 수 있습니다.