KT AIVLE SCHOOL/교육 받은 것들

시각지능 딥러닝 (1) - CNN -

y0.0ns 2023. 3. 15. 15:35

< CNN(Convolutional Neural Network) >

Neural Network 모델 중 하나로 이미지 분류에 주로 사용되는 딥러닝 구조이다.

CNN이 이미지를 분류하는 과정은 다음과 같다.

  1.  조각을 본다.
  2.  각 조각이 조합된 패턴을 본다.
  3.  점점 더 복잡한 조합의 패턴을 본다.
  4.  반응하는 여러 패턴의 조합을 가지고 이미지를 인식한다.

https://kr.mathworks.com/discovery/convolutional-neural-network-matlab.html

위의 그림과 같이 Convolution 과 Pooling의 과정을 거치는 것이 기존의 DNN(Deep Neural Network)와의 차이 점이다.

DNN의 2차원의 이미지를 Flatten레이어를 거쳐 1차원 데이터로 변환하는 과정이 이미지를 학습시키는 모델로서 적합한지 문제점이 제기 되었고 이러한 문제점을 해소한 것이 CNN이다. CNN은 공간적 정보를 유지 할 수 있기 때문에 이미지를 분류하는데 좋은 성능을 보인다.

 

< Convolution Layer >

Convolution Layer 에서는 일정한 크기의 Convolution filter를 통해서 이미지를 이동하면서(훑으면서) 새로운 feature를 추출해낸다. 이렇게 추출된 feature들은 Activation(ReLU)를 거쳐 feature map을 생성하게 된다. 만약 filter를 10개 사용하였다면 10개의 feature map이 생성된다.

https://towardsdatascience.com/simple-introduction-to-convolutional-neural-networks-cdf8d3077bac

 

< Stride 와 Padding >

 

feature를 추출하는 filter의 이동 간격을 Stride라고 한다. filter가 일정한 간격으로 이미지를 훑는다고 하면 이미지의 모서리 부분의 정보는 이미지의 중앙에 있는 정보에 비해 적게 활용될 수 밖에 없다. 이러한 문제를 해결하기 위해서 입력 데이터의 둘레를 0으로 채우는 것을 Padding이라고 한다.

filter_size=(3,3), stride=(1,1), padding='same'

위 그림의 점선 부분이 Padding이며 Stride를 1로 설정하면 그림과 같이 filter가 한칸씩 이동하는 것이다.

 

< Pooling Layer >

 

Pooling Layer는 over fitting을 방지하고 컴퓨터의 연산량을 줄이기 위하여 입력 데이터의 크기를 줄이는데 사용된다.

pool_size(2,2), stride(2,2)&nbsp; max pooling과 average pooling

 

pooling의 종류에는 max pooling과 average pooling이 있다. 

만약 pool_size가 (2, 2)라면 입력 데이터를 2x2의 박스로 훑으며 최댓값 또는 평균을 뽑아내어 새로운 feature map을 생성한다.

 


 

< 코드 예시 >

 

더보기

TensorFlow에서 Convolutional layer를 생성하기 위해서는 tf.keras.layers.Conv2D 클래스를 사용한다. 이 클래스는 필터 개수, 필터 크기, 스트라이드, 패딩 등의 매개변수를 설정할 수 있다. 아래는 tf.keras.layers.Conv2D 클래스를 사용하여 Convolutional layer를 생성하는 예시 코드이다.

import tensorflow as tf
from tensorflow import keras

# model = Sequential

## 1. 세션 클리어
keras.backend.clear_session()

## 2. 모델 선언
model = keras.models.Sequential()

## 3. 레이어 쌓기
model.add(keras.layers.Input(shape=(28, 28, 1)))

# convlution layer 추가
model.add(keras.layers.Conv2D(filters=32,
                              kernel_size=(3, 3),
                              padding='same',
                              activation='relu'))
# pooling layer 추가
model.add(keras.layers.MaxPool2D(pool_size=(2, 2),strides=(2, 2)))

# flatten layer 추가
model.add(keras.layers.Flatten())

# fully connected layer 추가
model.add(keras.layers.Dense(512, activation='relu'))

model.add(keras.layers.Dense(10, activation='softmax'))

## 4. 컴파일
model.compile(loss=keras.losses.sparse_categorical_crossentropy, metrics=['accuracy'], 
              optimizer='adam')

## 5. 요약
model.summary()