본문 바로가기

미정

CNN(합성곱 신경망) 개념 및 사용법

1. CNN (Convolutional Neural Networks) 개념

CNN은 딥러닝에서 주로 이미지나 영상 데이터를 처리할 때 쓰이며 이름에서 알 수 있다시피 Convolution이라는 전처리 작업이 들어가는 Neural Network 모델을 말한다. 

 

CNN의 탄생 배경을 살펴보면 DNN(Deep Neural Network)이 있다. 이 DNN은 기본적으로 1차원 형태의 데이터를 사용하는데 여기서 이미지 데이터를 한 줄의 데이터로 만드는 과정에서 이미지의 공간적/지역적 정보(spatial/topological information)가 손실이 되는 문제가 발생하고 이로 인해 결과적으로 학습시간과 능률의 효율성이 저하된다. 이러한 문제를 해결하여 나온 모델이 CNN이라고 할 수 있다.

 

CNN은 이미지(raw input) 그대로 받아 공간적/지역적 정보를 손실하지 않고 특성(feature)들의 계층을 빌드업하여 이루어진다. 결국 이미지 속에서 여러가지 특징들을 low level(여러가지 단순한 모양의 선)부터 high level(선이 모여진 어떤 형태의 모양)까지 찾아내서 이미지를 추론하는 딥러닝과정이다.

 

2. CNN 네트워크 구조

CNN Networks

CNN의 네트워크 구조는 Convolutional layer와 pooling layer들을 활성화 함수 앞뒤에 배치한 형태이다.

 

1) Convolutional layer

Convolutional layer는 간단하게 convolution과정과 활성 함수(activation function)를 거치는 과정이다.

여기서 여러 개의 filter(kernel)을 이용하여 다수의 convolution 결과값 도출이 가능하다. (feature mapping)

Convolutional layer

 

 

여기서 합성곱 신경망을 구성하는 코드를 보면 아래와 같다.

# 모델 구조 정의
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=X_train.shape[1:], padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))

model.add(Conv2D(64, (3, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# 전결합층
model.add(Flatten())    
model.add(Dense(512))   
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(nb_class))
model.add(Activation('softmax'))

 

keras.models 모듈의 Sequential 클래스를 사용해서 인공신경망의 각 층을 순서대로 쌓을 수 있다.

따라서 add() 메서드를 이용해서 합성곱 층 Conv2D와 Max pooling 층 MaxPooling2D를 반복해서 구성한다.

 

Convolutional layer에 해당하는 코드만 따로 보면 아래와 같다.

model.add(Conv2D(32, (3, 3), input_shape=X_train.shape[1:], padding='same'))
model.add(Activation('relu'))

 

첫 번째 Conv2D 층의 첫번째 인자 32는 filters 값이다.

합성곱 연산에서 사용되는 필터 (filter)는 이미지에서 특징 (feature)을 분리해내는 기능을 한다.

filters의 값은 합성곱에 사용되는 필터의 종류(개수)이며, 출력 공간의 차원(깊이)을 결정한다.

 

두 번째 인자 (3, 3)은 kernel_size 값이다.

kernel_size는 합성곱에 사용되는 필터 (=커널)의 크기이다.

 

세 번째 인자는 입력 데이터의 형태(input_shape)이다.

 

네 번째 인자는 padding로 이미지 데이터의 축소를 막고 Edge pixel data를 충분히 활용하기 위해 사용된다.

'valide'는 padding을 안하는 것이다.

'same'은 pooling 결과 size가 input size와 동일하게 padding하는 것이다.

 

Activation에는 'relu', 'sigmond', 'softmax'를 사용할 수 있다.

relu는 은닉층으로 역전파를 통해 좋은 성능이 나오기 때문에 마지막 층이 아니고서야 거의 relu를 사용한다.

sigmond는 'yes or no'와 같은 이진 분류, softmax는 확률 값을 내뱉어내 다양한 것을 분류하기 위해 마지막 층에서 사용된다.

 

2) Pooling layer

Convolutional layer를 거치고 나면 다수의 결과값이 생성되어 너무 많은 데이터를 다루게 되는 문제점이 생긴다. 이를 해결하기 위한 방법으로 pooling layer를 거치게 된다. pooling layer는 각 결과값(feature map)의 차원을 축소해 주는 것이 목적이고 feature 간의 correlation이 낮은 부분을 삭제하여 각 결과값의 크기(dimension)를 줄이는 과정이다.

pooling layer에는 크게 두 가지 방법으로 Max pooling과 Average pooling방법이 있다.

Max pooling방법은 feature map을 특정 크기로 잘라낸 후, 그 안에서 가장 큰 값을 뽑아내는 방법을 말하고,

Average pooling방법은 feature map을 특정크기로 잘라낸 후, 평균을 취해 뽑아내는 방법을 말한다.

 

 

Pooling layer에 해당하는 코드만 따로 보면 아래와 같다.

model.add(MaxPooling2D(pool_size=(2, 2)))

여기서는 Max pooling 방법을 사용하였고 pool_size는 pooling filter의 크기를 2 * 2로 하였다.

 

3) Dropout layer

droptout은 부가적으로 사용되는 layer로 학습의 overfitting을 막기 위해 네트워크의 유닛의 일부만 동작하고 일부는 동작하지 않도록 하는 방법을 말한다.

 

 

Dropout layer에 해당하는 코드만 따로 보면 아래와 같다.

model.add(Dropout(0.25))

Dropout의 인자는 rate를 의미한다.

여기서는 input 데이터에 25%의 노드들을 무작위로 0으로 만드는 dropout을 적용했다.

 

4) Flatten (Vectorization)

flatten 과정은 마지막 output layer을 1차원의 벡터 데이터로 변형하는 과정이다. 여기서 이미지 데이터를 1차원 배열로 만드는 것이 문제가 되지 않을까 생각할 수 있다. 하지만 앞의 여러 layer를 통해 입력 이미지에서 얻어온 특이점 데이터가 된 것이므로 1차원 데이터로 변형해도 무관하다.

 

Flatten에 해당하는 코드만 따로 보면 아래와 같다.

model.add(Flatten())

 

5) Dense layer

Dense layer는 입력과 출력을 모두 연결해주며, 입력과 출력을 각각 연결해주는 가중치를 포함하고 있다. 즉, 입력이 4개, 출력이 8개라면 가중치는 총 32개가 존재한다. 그리고 이 Dense layer는 가장 머신러닝에 기본적인 층으로 영상이나 서로 연속적으로 상관관계가 있는 데이터가 아니라면 이 층을 통해 학습 시킬 수 있는 데이터가 많다.

 

Dense layer에 해당하는 코드만 따로 보면 아래와 같다.

model.add(Dense(512))

Dense함수의 첫 번째 인자는 출력 노드의 수이다.

 

 

<참고 자료>

10. 합성곱 신경망 사용하기 - Codetorial

 

10. 합성곱 신경망 사용하기 - Codetorial

합성곱 신경망 (Convolutional neural network, CNN)은 시각적 이미지 분석 및 분류에 가장 일반적으로 사용되는 인공신경망입니다. 이번 페이지에서는 합성곱 신경망을 사용해서 MNIST 이미지 데이터셋을

codetorial.net

CNN[합성곱 신경망] 개념, 모델구조 (tistory.com)

 

CNN[합성곱 신경망] 개념, 모델구조

CNN (Convolutional Neural Networks) CNN은 딥러닝에서 주로 이미지나 영상 데이터를 처리할 때 쓰이며 이름에서 알 수 있다시피 Convolution이라는 전처리 작업이 들어가는 Neural Network 모델을 말한다. CNN의..

keeper.tistory.com

케라스(Keras) 덴스 레이어(Dense layer) 및 활성화 함수 종류 : 네이버 블로그 (naver.com)

 

케라스(Keras) 덴스 레이어(Dense layer) 및 활성화 함수 종류

우리는 흔히 머신러닝이라고 하면 위와 같은 그림을 자주 볼 수 있을 것이다. 어떻게 학습을 하고 이를 반...

blog.naver.com

[ CNN ] pooling이란? (tf.keras.layers.MaxPool2D) (tistory.com)

 

[ CNN ] pooling이란? (tf.keras.layers.MaxPool2D)

pooling (tf.keras.layers.MaxPool2D) Pooling 이란. CNN에서 pooling이란 간단히 말하자면 특징을 뽑아내는 과정이라고 할 수 있다. 먼저 CNN의 pooling 이전의 진행 과정을 간단히 살펴보자. CNN이라는 게 결국..

supermemi.tistory.com

 

'미정' 카테고리의 다른 글

GitHub에 CMD로 파일 올리고 받기  (0) 2023.06.16
batch_size와 epochs  (0) 2022.07.15
WinMerge  (0) 2022.03.18
Doxygen  (0) 2022.03.04
라즈베리파이 한글 입력 설정  (1) 2021.05.27