본문 바로가기

수업내용정리/인공지능

[Tensorflow][Keras]CNN이란? CNN에 대해 개략적으로 살펴보기

CNN은 무엇인가? 

 

Covolutional Neural Network의 약자로 합성곱을 이용한 신경망이라고 보면 된다.

주로 이미지를 처리하는 데 사용되는 신경망이다.

 

합성곱이란?

필터라는 nxm크기의 행렬로 h*m*c의 이미지를 처음부터 끝까지 겹치며 훑으면서 겹쳐지는 부분의 각 이미지와 커널의 원소의 값을 곱해서 모두 더한 값을 출력으로 하는 것을 의미한다. 이해가 잘 되지 않는다면 다음과 같은 예시들을 살펴보자.

 

1차원행렬인 (1,2,3,4)와 (5,6,7,8)의 행렬곱을 살펴보자.

두 행렬의 크기가 같으므로 한번만 겹쳐지며 연산이 행해진다.

 

다음으로 2차원행렬끼리의 합성곱을 살펴보도록 하자.

이 또한 1차원 행렬곱과 마찬가지로 두 행렬의 모양이 같으므로 한 번만 겹쳐지며 연산이 행해진다.

 

만약 이해가 되지 않는다면 아래에서 보다 자세히 다룰 예정이니 참고해보도록 하자.

CNN의 과정

CNN은 보통 아래와 같이 합성곱, 활성화함수, Pooling, Flatten, 그리고 마지막으로 분류를 하는 Dense 층 등으로 구성된다고 보면 된다.

 

합성곱

합성곱이란 

필터라는 nxm크기의 행렬로 h*m*c의 이미지를 처음부터 끝까지 겹치며 훑으면서 겹쳐지는 부분의 각 이미지와 커널의 원소의 값을 곱해서 모두 더한 값을 출력으로 하는 것을 의미한다

 

 

 여기선 3X3크기의 행렬인 Filter와 5X5X1의 크기인 이미지에 대해 행해지는 합성곱이다.

이렇게 행해진 합성곱에 대한 결과물로 나오는 행렬은 Feature Map이라 불리며 이미지의 분류에 쓰인다.

 

 

 

 

 

 

 

Pooling

Feature Map 으로부터 좀 더 특징을 잘 뽑아내고 매개변수의 양을 줄여주기 위해 사용된다.

종류에는  MaxPooling, GlobalMaxPooling, 그리고 Global Average Pooling 등 이있다.

 

Max Pooling

필터 내에서 원소들 중 가장 큰 값을 결과로 하는 Pooling이다.

 

Average Pooling

필터 내의 원소들의 평균을 결과로 하는 Pooling이다.

 

 

Global Average Pooling

앞서 두 Pooling과는 달리 각 채널의 원소들의 평균을 결과로 하며 

일차원 벡터로 만들어 준다는 특징이 있다. 마지막 층에 Dense 대신 사용이 가능하기도 하다.

 

Flatten

위의 연산들로 나온 행렬들을 일렬로 늘여놓아 일차원 벡터로 변환해주는 역할을 한다.

 

CNN 과정 다시 보기

다시 한번 요약하자면 CNN의 과정은 다음과 같다고 요약이 가능하다.

32x32x3의 이미지가 3x3크기의 필터와 합성곱을 하는 과정을 거쳐 30x30x3이 되며,

이를 활성화 함수 'relu'에 넣은 후 Max Pooling 과정을 통해 15x15x3이 되며

Flatten 과정을 거쳐 675x1의 크기가 되며

Dense의 과정을 거치면 10(분류할 클래스의 개수)의 크기가 결과로 나온다.

 

실제로 해당 모양이 나오는지를 코드를 통해 확인이 가능하다.

 

 

CNN을 코드로 구현하기

위 과정들을 코드로 간략하게 구현하면 다음과 같이 나타낼 수 있다.

from tensorflow.keras.layers import Conv2D, Conv1D, Dense, MaxPooling2D, Flatten
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
CNN_model = Sequential()
CNN_model.add(Conv2D(3,(3,3),groups=3,input_shape=(32,32,3,)))
CNN_model.add(MaxPooling2D())
CNN_model.add(Flatten())
CNN_model.add(Dense(10,activation = 'softmax' ))
CNN_model.compile(optimizer='adam',loss='sparse_categorical_crossentropy')

*다만 실제 동작시 groups 파라미터를 통해 입력이 채널 축을 따라 분할되는 그룹 수를 지정할 수 있다.

(단, 필터의 개수는 groups으로 나누어 떨어져야 한다.)

ex) 채널이 C개이며 groups 가 G이면 채널별로 C/G 개의 필터가 연산이 수행된다.

 

*groups 미지정시 채널과 상관없이 연산이 진행된다*


이번시간에는 CNN에 대해 간략하게 알아보는 시간을 가졌다.

다음시간에는 각 과정들에 대해 좀 더 자세히 살펴볼 예정이다.

참조

 

https://wikidocs.net/64066

 

11-01 합성곱 신경망(Convolution Neural Network)

합성곱 신경망(Convolutional Neural Network)은 이미지 처리에 탁월한 성능을 보이는 신경망입니다. 하지만 합성곱 신경망으로 텍스트 처리를 하기 위한 시도들이…

wikidocs.net

 

https://ko.wikipedia.org/wiki/%ED%95%A9%EC%84%B1%EA%B3%B1_%EC%8B%A0%EA%B2%BD%EB%A7%9D

 

합성곱 신경망 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 합성곱 신경망(콘볼루션 신경망, Convolutional neural network, CNN)은 시각적 영상을 분석하는 데 사용되는 다층의 피드-포워드적인 인공신경망의 한 종류이다. 필터링

ko.wikipedia.org

 

https://keras.io/api/datasets/cifar10/#load_data-function

 

Keras documentation: CIFAR10 small images classification dataset

CIFAR10 small images classification dataset [source] load_data function tf.keras.datasets.cifar10.load_data() Loads the CIFAR10 dataset. This is a dataset of 50,000 32x32 color training images and 10,000 test images, labeled over 10 categories. See more in

keras.io

 

https://keras.io/api/layers/convolution_layers/convolution2d/

 

Keras documentation: Conv2D layer

Conv2D layer [source] Conv2D class tf.keras.layers.Conv2D( filters, kernel_size, strides=(1, 1), padding="valid", data_format=None, dilation_rate=(1, 1), groups=1, activation=None, use_bias=True, kernel_initializer="glorot_uniform", bias_initializer="zeros

keras.io