SW/인공지능

인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석

얇은생각 2019. 6. 26. 12:30
반응형

이 글에서는 CNN(Convolutional Neural Networks)을 탐구하고, 높은 수준에서 그것들이 어떻게 두뇌의 구조에서 영감을 얻는지 살펴보기로 하겠습니다.




The Brain

우리는 끊임없이 주변의 세계를 분석합니다. 의식적인 노력 없이, 우리는 우리가 보는 모든 것에 대해 예측을 하고, 그것에 따라 행동합니다. 우리가 어떤 것을 볼 때, 과거에 배운 것을 바탕으로 모든 대상에 라벨을 붙입니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석



여러분은 아마 "저 아이는 의자 위에 서 있는 행복한 소년이다."라고 생각할 수 있습니다. 아니면 비명을 지른다고 생각할 수 있습니다. 또는 케이크를 망치려는 것으로 볼 수 있습니다.


이것이 우리가 하루 종일 아낌없이 하는 것입니다. 우리는 패턴을 보고, 라벨을 붙이고, 예측하고, 인지합니다. 하지만 어떻게 그렇게 할 수 있을까요? 우리가 보는 모든 것을 어떻게 해석할 수 있을까요?


자연은 이것을 위해 시스템을 만드는 데 5억년이 넘게 걸렸습니다. 즉, 눈과 뇌의 상호작용이 우리 주변의 세상을 바라 볼 수 있는 근본적인 이유입니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석



보는 것에 대한 실제적인 해석은 뇌에서, 1차 시각적 피질에서 일어납니다.


물체를 볼 때, 눈에 있는 빛 수용기는 입력이 처리되고 있는 1차 시각피질로 신호를 보냅니다. 1차 시각피질은 눈이 보는 것을 이해합니다.


이 모든 것이 우리에게 매우 자연스러운 것처럼 보입니다. 우리는 삶에서 보는 모든 대상과 사람들을 인식할 수 있다는 것이 얼마나 특별한지에 대해 거의 생각하지도 않습니다. 뇌의 뉴런과 연결의 매우 복잡한 계층 구조는 물체를 기억하고 라벨을 붙이는 이 과정에 중요한 역할을 합니다.


예를 들어, 우산이 무엇인지 어떻게 배웠는지 생각해 보겠습니다. 부모님이나 가족은 우리에게 직접적인 환경에 있는 물건들의 이름을 말해주었습니다. 우리는 주어진 예를 통해 배웠습니다. 천천히 그러나 확실히 우리는 우리의 환경에서 특정한 것들을 점점 더 자주 인식하기 시작했습니다. 다음에 우리가 그것들을 보았을 때, 우리는 즉시 이 물체의 이름이 무엇인지 알 수 있습니다. 그것들은 바로 우리의 모델이 되는 것입니다.




Convolutional Neural Networks

아이가 사물을 인식하는 법을 배우는 방법과 유사하게, 우리는 입력 내용을 일반화하고 이전에 보지 못했던 이미지에 대한 예측을 하기 전에 수백만 장의 사진을 알고리즘에 보여줄 필요가 있습니다.


컴퓨터는 우리와는 다른 방식으로 '보고' 있습니다. 그들의 세계는 숫자로만 이루어져 있습니다. 모든 이미지는 픽셀로 알려진 2차원 숫자의 배열로 표현됩니다.


하지만 컴퓨터가 다른 방식으로 이미지를 인식한다는 사실로, 우리가 컴퓨터에게 패턴을 인식하도록 훈련시킬 수 없다는 것을 의미하지는 않습니다. 우리는 단지 어떤 이미지가 다른 방식으로 존재하는지 생각하기만 하면 됩니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석


영상에서 물체를 인식하는 방법을 알고리즘에 가르치기 위해, 우리는 특정 유형의 인공 신경망을 사용합니다. ( CNN(Convolutional Neural Network) )


CNN은 뇌에서 영감을 받았습니다다. 포유류가 세상을 시각적으로 인식하는 방법에 대한 새로운 모델을 제안된 것입니다. 고양이와 원숭이 시각 피질에는 직접적인 환경에서 독점적으로 반응하는 뉴런이 포함되어 있다는 것을 알아내었습니다.


논문에서, 각각 다른 방식으로 작용하는 뇌의 시각 뉴런 세포의 두 가지 기본적인 형태, 즉 단순한 세포와 복잡한 세포에 대해 설명했습니다.


복잡한 세포는 망막의 절대 위치가 바뀌어도 일정한 자극에 계속 반응합니다.


시각에서, 단일 감각 신경 세포의 수용 영역은 망막의 특정 영역으로, 그 신경 세포의 발화에 무언가가 영향을 미칩니다. 모든 감각 신경 세포는 유사한 수용장을 가지고 있습니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석



게다가, 계층의 개념은 뇌에서 중요한 역할을 합니다. 정보는 패턴의 순서에 따라 순차적으로 저장됩니다. 뇌의 가장 바깥 층인 신피질은 정보를 계층적으로 저장합니다. 그것은 피질 기둥이나 신피질에 있는 뉴런의 균일하게 조직된 그룹에 저장됩니다.


1980년에 후쿠시마라는 연구자가 계층적 신경망 모델을 제안했습니다. 그는 그것을 신인지론이라고 불렀습니다. 이 모델은 단순하고 복잡한 세포의 개념에서 영감을 얻었습니다. 신인지론은 물체의 형상에 대해 배우면서 패턴을 인식할 수 있다는 것입니다.


이후 1998년 벵기오, 르쿤, 보투, 해프너에 의해 컨볼루션 신경망이 소개되었습니다. 그들의 첫 번째 Convolutional Neural Network는 LeNet-5라고 불렸으며 손으로 쓴 숫자와 숫자를 구분할 수 있었습니다.




Architecture

나머지 부분에서는 CNN의 구조를 살펴보고 파이썬의 구현도 알아보겠습니다.


Convolutional Neural Networks는 일반 Neual Networks와 다른 아키텍처를 가지고 있습니다. 일반 신경망은 일련의 숨겨진 레이어를 통해 입력을 변환합니다. 모든 층은 일련의 뉴런으로 이루어져 있으며, 각 층은 이전의 층에 있는 모든 뉴런과 완전히 연결되어 있습니다. 마지막으로, 예측을 나타내는 마지막 완전 연결 계층, 즉 출력 계층이 있습니다.


컨볼루션 신경망은 약간 다릅니다. 우선 층은 폭, 높이, 깊이 등 3차원으로 구성됩니다. 또한, 한 층의 뉴런은 다음 층의 모든 뉴런과 연결되지 않고 단지 작은 영역에만 연결됩니다. 마지막으로, 최종 산출물은 깊이 차원을 따라 구성된 확률 점수의 단일 벡터로 감소될 것입니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석



CNN은 두 가지 요소로 이루어져 있다.


- 히든 레이어


이 파트에서, 네트워크는 피쳐들이 감지되는 동안 일련의 콘볼루션과 풀링 작업을 수행합니다. 만약 여러분이 얼룩말의 사진을 가지고 있다면, 이 부분은 네트워크가 그것의 줄무늬, 두 귀, 네 개의 다리를 인식하는 부분입니다.


- 분류 부분


여기서 완전히 연결된 층(fully connected layer)은 이러한 추출된 특징들 위에 분류자 역할을 합니다. 그들은 알고리즘이 예측하는 대로 영상에 있는 물체에 대한 확률을 할당합니다.



# before we start building we import the libraries

import numpy as np

from keras.layers import Conv2D, Activation, MaxPool2D, Flatten, Densefrom keras.models import Sequential


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석





Feature extraction

콘볼루션은 CNN의 주요 구성 요소 중 하나입니다. convolution이라는 용어는 세 번째 함수를 생성하기 위해 두 함수의 수학적인 조합을 말합니다. 이것은 두 세트의 정보를 병합합니다.


CNN의 경우 입력 데이터에 대해 필터나 커널을 사용하여 convolution을 수행하여 피쳐 맵을 생서합니다.


우리는 필터를 Input 위로 밀어넣음으로써 합칩니다. 모든 위치에서 매트릭스 곱셈이 수행되고 결과를 Feature Map에 요약합니다. 


아래의 애니메이션에서는, convolution 동작을 볼 수 있습니다. 필터(녹색 사각형)가 우리의 입력(파란색 사각형) 위로 가는 것을 볼 수 있으며, 합한 합은 피쳐 맵(빨간색 사각형)으로 들어갑니다.


우리 필터의 영역은 뉴런 세포의 이름을 따서 수용장이라고도 불립니다. 이 필터의 크기는 3×3입니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석





설명을 위해서 2D로 동작을 보여드렸지만, 실제로는 3D로 진행되는 콘볼루션입니다. 각 이미지는 폭, 높이 및 깊이에 대한 디멘션을 가진 3D 매트릭스로 표현됩니다. 깊이는 이미지에 사용되는 색상 채널(RGB) 때문에 차원이 됩니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석




입력에 수많은 난해도를 부여하는데, 각 작업에서 다른 필터를 사용합니다. 이렇게 하면 피쳐 맵이 달라집니다. 결국, 이러한 피쳐 맵을 모두 취하여, 그것들을 콘볼루션 계층의 최종 출력물로 합칩니다.


다른 신경망과 마찬가지로, 출력을 비선형적으로 만들기 위해 활성화 기능을 사용합니다. Convolutional Neural Network의 경우, convolution의 출력은 활성화 기능을 통해 전달됩니다. 이것은 ReLU 활성화 기능일 수도 있습니다.


스트라이드는 매번 콘볼루션 필터가 움직이는 단계의 크기입니다. 보폭 크기는 보통 1이며, 이는 필터가 픽셀을 픽셀 단위로 옮겨가는 것을 의미합니다. 스트라이드 크기를 증가시킴으로써, 필터는 더 큰 간격을 두고 Input 위로 들어가므로 셀 사이에 겹치는 것이 적어집니다.


아래의 애니메이션은 1의 움직임을 보여줍니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석



피쳐 맵의 크기는 항상 Input보다 작기 때문에, 피쳐 맵이 축소되는 것을 막기 위해 무엇인가를 해야 합니다. 여기가 바로 패딩을 사용하는 곳입니다.


0 값 픽셀 층을 추가하여 입력에 0을 둘렀으므로 피쳐 맵이 줄어들지 않습니다. 패딩은 콘볼루션을 수행한 후 공간 크기를 일정하게 유지하는 것 외에도 성능을 향상시키고 커널과 스트라이드 크기가 입력에 맞도록 합니다.


콘볼루션 레이어 후 CNN 레이어 사이에 풀링 레이어를 추가하는 것이 일반적입니다. 풀링의 기능은 네트워크의 매개변수 및 연산을 줄이기 위해 치수성을 지속적으로 감소시킵니다. 이렇게 하면 훈련 시간이 단축되고 오버핏을 제어할 수 있습니다.


풀링의 가장 빈번한 유형은 각 창에서 최대값을 차지하는 최대 풀링입니다. 창 크기를 미리 지정해야 합니다. 이는 중요한 정보를 유지하는 동시에 피쳐 맵 크기를 감소시킵니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석



따라서 CNN을 사용할 때 우리가 결정해야 할 4가지 중요한 하이퍼 파라미터는 다음과 같습니다.


- 커널 사이즈

- 필터 수(즉, 사용할 필터 수)

- 스트라이드(필터의 계단 크기)

- 패딩




# Images fed into this model are 512 x 512 pixels with 3 channels

img_shape = (28,28,1)

# Set up the model

model = Sequential()

# Add convolutional layer with 3, 3 by 3 filters and a stride size of 1
# Set padding so that input size equals output size

model.add(Conv2D(6,2,input_shape=img_shape))

# Add relu activation to the layer

model.add(Activation('relu'))

#Pooling

model.add(MaxPool2D(2))


연결층을 시각화하는 좋은 방법은 아래와 같습니다. 잠깐 보고 무슨 일이 일어나고 있는지 정말로 이해하면 좋을 것 같습니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석





Classification

연결 층과 풀링 레이어 후, Classification 부분은 몇 개의 완전히 연결된 레이어(fully connected layer)로 구성되어 있습니다.  그러나 완전히 연결된 이러한 계층은 1차원 데이터만 수용할 수 있습니다. 3D 데이터를 1D로 변환하기 위해서, 파이썬에서 flatten 함수를 사용합니다. 이것은 본질적으로 3D 볼륨을 1D 벡터로 변환합니다.


Convolutional NN의 마지막 계층은 완전히 연결된 계층입니다. 완전히 연결된 계층의 뉴런은 이전 계층을 모두 활성화하여 완전히 연결됩니다. 이 부분은 원칙적으로 일반 신경망과 동일합니다.


#Fully connected layers

# Use Flatten to convert 3D data to 1Dmodel.add(Flatten())

# Add dense layer with 10 neuronsmodel.add(Dense(10))

# we use the softmax activation function for our last layermodel.add(Activation('softmax'))

# give an overview of our model

model.summary

# _________________________________________________________________
# Layer (type) Output Shape Param
# =================================================================
# conv2d_1 (Conv2D) (None, 27, 27, 6) 30
# _________________________________________________________________
# activation_1 (Activation) (None, 27, 27, 6) 0
# _________________________________________________________________
# max_pooling2d_1 (MaxPooling2 (None, 13, 13, 6) 0
# _________________________________________________________________
# flatten_1 (Flatten) (None, 1014) 0
# _________________________________________________________________
# dense_1 (Dense) (None, 10) 10150
# _________________________________________________________________
# activation_2 (Activation) (None, 10) 0
# =================================================================
# Total params: 10,180Trainable params: 10,180Non-trainable params: 0
# __________________________________________________________________





Training

CNN을 훈련시키는 것은 백프로파제이션이나 구배계(gradient down)를 이용하는 일반 신경망과 같은 방식으로 동작합니다. 그러나, 여기에서는 조금 더 수학적으로 복잡합니다. 그 이유는 복잡한 작업 때문입니다.



"""Before the training process, we have to put together a learning process in a particular form.
It consists of 3 elements: an optimiser, a loss function and a metric."""

model.compile(loss='sparse_categorical_crossentropy', optimizer = 'adam', metrics=['acc'])

# dataset with handwritten digits to train the model onfrom keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = np.expand_dims(x_train,-1)

x_test = np.expand_dims(x_test,-1)

# Train the model, iterating on the data in batches of 32 samples# for 10 epochs

model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_test,y_test)

# Training...




Summary

요약하면 CNN은 특히 이미지 분류와 인식에 유용합니다. 두 개의 주요 부분을 가지고 있습니다. 바로 피쳐 추출 부분과 분류 부분입니다.


CNN의 주요 특수 기법은 convolution인데, 여기서 필터가 Input 위로 들어가 입력값 + 피쳐 맵의 필터 값을 합칩니다. 결국, 목표는 CNN에 새로운 이미지를 주입하여, CNN이 생각하는 물체가 보이는지 또는 텍스트로 이미지를 묘사할 수 있도록 하는 것입니다.


인공지능 : CNN(Convolutional Neural Networks) 개념, 예제, 분석

반응형