Data Science/DL

CNN(Convolutional Neural Network)

희스레저 2022. 11. 4. 00:36

CNN(Convolutional Neural Network)

Convolution을 통한 FilteringMax Pooling을 반복하여 정말 중요한 특징을 정제한 후 Classification하는 것

 

과정

Feature extraction + Classification

- Feature extraction: Convolutional layer + max pooling, 특징을 뽑아냄

- Classification: Fully-connected layer, 물체를 판단함

 


Neural Network 이전에는?

Adaptive boosting(Adaboost)

:사람이 기정의한 필터를 크기와 모양을 바꾸고 회전시키며 빨간색의 바운딩 박스 영역에 대해 computation 연산을 함

좌상단에서부터 슬라이딩하며 반응값(확률값)이 높을 때 빨간색 네모 박스를 그림.

 

Neural Network

퍼셉트론

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력하는 알고리즘이다.

▶ 쉽게 말하면 입출력을 갖춘 알고리즘이며, 입력을 주면 정해진 규칙에 따른 값을 출력한다.

 

- 퍼셉트론의 목표: input(x)에 대한 output(y)을 가장 잘 예측하는 weight(w, parameter)를 찾는 것

- 단층 퍼셉트론의 한계: XOR(X1, X2가 같으면 0 다르면 1값을 가짐)의 case를 하나의 직선으로 분류할 수 없음

즉, 선형분류가 가능한 decision boundary만 생성함

→ 최소 두 개의 직선, 곡선을 그어서 해결

 레이어를 많이 쌓음으로써 해결

 

MLP(Dense layer = Fully connected layer로 사용하기 도 함)

- 멀티 레이어 퍼셉트론: 이것 또한 input(x)에 대한 output(y)을 가장 잘 예측하는 weight(w, parameter)를 찾는 것

행과 열이 있는 2차열 데이터를 1차열 열벡터로 transform하는 것이 MLP의 첫 단계

이미지 분류에 사용하기엔 단점이 있음. MLP가 학습 데이터에 대하여 overfitting이 발생함.

 

CNN은 이러한 과대적합 문제를 어떻게 해결하는가?

2차원 데이터에서 바로 특징을 찾아냄.

특징을 찾는 단계에서는 데이터를 1단계로 변환시키지 않는다.

 

활성화함수

: 레이어를 쌓는 효과를 얻기 위함

> 선형 활성화함수

> 비선형 활성화함수:  Sigmoid, tanh, Relu, Leaky Relu, Softmax.

   일반적으로 Relu를 많이 사용하여 Output단에서는 분류를 위해 보통 시그모이드(binary classification), softmax(multi classification)를 사용함

 

 

손실함수

: 모델이 얼마나 잘 작동하는지 측정하기 위한 척도로 Loss를 사용

*Loss: 모델 output값과 정답값과의 차이, 이것을 줄이는 방향으로 학습시키는 것이 목표

- 종류: MAE(평균절대오차), MSE(평균제곱오차), 이진교차엔트로피(Binary Cross-Entropy), 범주교차엔트로피(Categorical Cross-Entropy)

- Binary Cross-Entropy: 예측 0과 1사이의 확률 값, 예측값이 1에 가까울 수록 True(양성)일 확률이 큼

- Categorical Cross-Entropy: Class 수가 3 이상인 분류에 사용하고 one-hot encoding 형태(정답 클래스만 1, 나머지는 0)

 

Backpropagation(BP, 역전파 알고리즘)

:input(x)에 대한 output(y)을 가장 잘 예측하는 weight(w)를 찾기 위해 순전파와 반대 방향으로 나아가며 w를 조정하는 방법

 

Sigmoid 미분

Sigmoid는 0과 1사이 값을 가지는데, 이를 미분할 경우에도 0~1 사이 값을 가진다.

0과 1사이 값을 계속 곱해주다 보면 숫자가 0에 수렴한다.

→ Gradient Vanishing 문제 발생

 

* Sigmoid와 Softmax 차이: 둘 다 logistic regression에서 사용되는 점은 같다.

Sigmoid의 경우 activation(활성화함수) 기능으로 사용한다.

Gradient Vanishing(기울기 소실)

Gradient가 역전파 과정에서 반복적으로 곱해지며 0에 가까워지는 현상.

이를 피하기 위해 ReLU, Normalization 방법을 사용한다.

* RNN에서는 Gradient Exploding(기울기 폭주) 문제가 자주 발생함

 

Gradient Descent(경사하강법)

Local minimum, Saddle point에서 빠져나오기 어려운 문제점이 발생.

Momentum 기법을 사용하거나, Adagrad, RMSProp(Adagrad 학습을 오래할 경우 step size가 너무 줄어 학습이 더 이상 되지 않는 문제를 해결하기 위함), Adam(Adaptive Moment Estimation)

* Adam: RMSProp + Momentum, 가장 많이 사용되는 기법. 지금까지 계산해 온 gradient의 지수평균을 저장(momentum), gradient 제곱값의 지수평균을 저장

 


Convolution?

이미지 2개를 합칠 때 하나를 y축 기준으로 대칭시켜 차례차례 곱해나가며 누적시키는 것.

이러한 원리를 토대로 Neural Network의 이미지 학습에도 적용한 것이 CNN

이미지를 classification하는데 필요한 정보(feature)를 뽑아냄

 

Convolution layer는 입력 데이터에 필터를 적용한 후 활성화 함수를 반영하는 필수 요소

이미지 데이터는 원래 높이x너비x채널의 3차원 텐서(tensor)

 

Convolution layer에서 필터 개수를 통해 차원의 수를 결정함

여기서 각각의 필터는 (필터개수 x) input image(28*28*1)만큼의 depth(1)를 가져야함

필터를 거친 activation map은 필터의 개수만큼 만들어진다.

1x1 convolution layer는 이미지 크기를 유지하며, 필터 개수를 통해 depth크기를 줄인다.

 

필터 개수와 필터의 이해 돕기:

https://euneestella.github.io/research/2021-10-14-why-we-use-1x1-convolution-at-deep-learning/

 

Zero Padding

Convolution layer를 거치면 3x3 이미지가 2x2 이미지가 되는 등 정보의 손실이 일어나고, 동시에 특징을 뭉뚱그려서 더 작은값으로 저장하게 됨. 이 정보의 손실을 최소화하고자 Zero Padding이라는 기술이 존재함.

이미지 끝자락을 0으로 채워(padding), 필터를 통과시켜도 3x3 사이즈를 유지하도록 함.

 

Max Pooling

필터를 거쳐서 나온 값(feature map) 중 숫자가 가장 큰 것(특징이 가장 뚜렷하게 나타나는 것). 그 큰 값만 남기고 다 없애버리는 것이 Max Pooling → 정보 손실이 엄청남, but 가장 강한 특징만 남겨서 이정도는 감수해야 진행할 이미지 연산이 가능함

이때 depth 크기는 유지되고, 이미지 크기를 줄인다.

 

Batch Normalization

이전 레이어의 파라미터 변화로 현재 레이어의 입력 분포가 바뀌는 현상 방지

Local Minimum 빠짐을 방지

Sequential 레이어 중간에 수행

 

Dropout

랜덤한 확률로 layer 내에 있는 뉴런을 제거 후 학습하는 기법

매 학습마다 새롭게 제거된 뉴런의 조합으로 인하여 앙상블 러닝 효과 발생

과적합을 방지, 일반적으로 0 ~ 0.5 사이 값으로 setting

(FC Layer 과정에서 실행)

 


 

코드 진행(MNIST) with Keras

처음 데이터셋을 불러와(train, test 이미 분류되어 있음)

X_train, X_test의 배열을 확인할 경우

train은 6만개의 데이터셋이며 28*28개의 배열이고 test는 1만개의 데이터셋이며 28*28개의 배열임을 볼 수 있다.

채널 수(pixel) 에 대한 정보는 없다.

(60000, 28, 28) → (60000, 28, 28, 1)

 

numpy의 reshape 함수를 이용해

X_train, Y_train을 각각 (데이터 개수, width, height, pixel)로 만든다.

 

* keras에서 CNN을 구현할 때, (pixel, width, height) 형태로 input을 받는다

데이터는 grey scale이므로 pixel 값에 1을 입력한다.(컬러일 경우 3을 입력함)

mnist 데이터의 경우 28*28 손글씨 이미지이므로 width, height가 각각 28이다.

참고: https://velog.io/@nameunzz/Aiffel-TIL-deeplearning-start

 

또한 grey scale이므로 0~255 값을 가진다. 255로 나누어 데이터를 정규화한다.

y 데이터의 경우 one-hot vector로 변환한다.(keras.utils.to_categorical(Y_train, 10))