본문 바로가기

Deep Learning With Tensorflow/04.컨볼루션 신경망

01. 심층 컨블루션 신경망(DCNN)

반응형

심층 컨볼루션 신경망(DCNN)은 여러 신경망 계층으로 구성합니다. 일반적으로 컨볼루션과 폴링(Pooling)이라는 두 유형의 계층이 번갈아 가며 사용됩니다. 각 필터의 깊이는 왼쪽에서 오른쪽으로 갈수록 깊어진다. 마지막 단계는 일반적으로 하나 이상의 완전 연결 계층으로 구성된다.

 

 

컨볼루션 개념에는 3가지 핵심 키워드로 로컬 수용 필요(Receptive Field), 가중치 공유, 풀링(Pooling)이 있다.

 


완전연결 계층의 문제점과 합성곱층(Convolutional Layer)의 발전

 

 완전연결 계층(fully Connected Layer)을 이용해 MNIST데이터셋을 분류하는 모델을 만들 때, 3차원(세로, 가로, 채널)인 MNIST 데이터(28, 28, 1)를 입력층(Input Layer)에 넣어주기 위해서 아래의 그림처럼 3차원을 1차원의 평평한 데이터로 펼쳐줘야 합니다. 즉,(28, 28,1)의 3차원 데이터를 28 × 28 × 1 = 784의 1차원 데이터로 바꾼다음 입력층에 넣어줘야 합니다.

 

여기서 완전연결계층의 문제점은 바로 '데이터의 형상이 무시'된다는 것입니다. 

 

그래서 합성곱층은 CNN에서 가장 중요한 구성요소이며, 완전연결 계층과는 달리 합성곱층(Convolutional Layer)은 아래의 그림과 같이 입력 데이터의 형상을 유지한다는 것입니다. 

 

3차원의 이미지 그대로 입력층에 입력받으며, 출력 또한 3차원 데이터로 출력하여 다음 계층(Layer)으로 전달하기 때문에 CNN에서는 이미지 데이터처럼 형상을 가지는 데이터를 제대로 학습할 가능성이 높다고 할 수 있습니다.

 

 

합성곱층의 뉴런은 아래와 같이 입력 이미지의 모든 픽셀에 연결되는 것이 아니라 합성곱층 뉴런의 수용영역(Receptive Field)안에 있는 픽셀에만 연결이 됩니다. 

 

즉, 수용영역이란 외부 자극이 전체 영향을 끼치는 것이 아니라 특정 영역에만 영향을 준다는 뜻입니다. 마찬가지로 영상에서의 특정 위치에 있는 픽셀들은 그 주변에 있는 일부 픽셀들과만 상관관계가 높을 뿐이며, 거리가 멀어지면 그 영향은 감소하게 된다는 것을 의미합니다. 


가중치 공유와 편향

 

입력 이미지에 배치된 위치와 독립적으로 동일한 특징을 감지하는 기능을 통해 원시 이미지의 픽셀 표현에서 벗어나고 싶다고 가정해보겠습니다. 간단한 방법은 은닉층의 모든 뉴런에 대해 동일한 가중치와 편향을 사용하는 것이다.

 

이러한 방식으로 각 계층은 이미지에서 파생된 위치 독립적인 잠재 특징 집합을 학습하며, 계층은 병렬로 된 커널 집합으로 구성되고 커널은 하나의 특징만 학습한다.

 

 


수학적 예제

 

컨볼루션을 이해하는 간단한 방법 중 하나는 행렬에 적용된 슬라이딩 윈도우 함수를 생각해보는 것이다. 다음 예제에서 입력 행렬 I와 커널 K가 주어지면 컨볼루션된 출력을 얻는다. 3×3커널 K(종종 필터 또는 특징 검출기라고도 함)는 입력 행렬과 요소별로 곱해 출력 행렬에서 하나의 셀을 얻는다.

 

 

 

이런식의 연산을 합성곱 계층의 연산이라고 합니다. 연산의 방법을 아래의 내용으로 설명하면 입력데이터는 (4,4), 필터는 (3,3)이고, 필터가 바로 Conv Layer의 가중치에 해당합니다.

 

합성곱 연산은 필터의 윈도우를 일정한 간격으로 이동해가며 계산합니다.

 

 여기서 패딩(Padding)이 나오는데요.  패딩은 합성곱 연산을 수행하기 전, 입력데이터 주변을 특정값으로 채워 늘리는 것을 말합니다. 패딩(Padding)은 주로 출력데이터의 공간적(Spatial)크기를 조절하기 위해 사용합니다. 패딩은 주로 zero-padding을 사용합니다.

 

패딩을 사용하는 이유는 패딩을 사용하지 않을 경우, 데이터의 Spatial크기는 Conv Layer를 지날 때 마다 작아지게 되므로, 가장자리의 정보들이 사라지는 문제가 발생하기 때문에 패딩을 사용합니.

 

커널의 깊이는 입력 깊이(채널)와 같다는 점에 주목합니다.  또 다른 선택은 각 단계마다 슬라이딩 윈도우를 얼마나 멀리 슬라이딩 시키는가에 관한 것이다. 이를 스트라이드(Stride)라고 합니다. 스트라이드가 클수록 커널의 응용이 적고 출력 크기도 작아지며, 스트라이드가 작을수록 더 많은 출력을 생성하고 더 많은 정보를 유지합니다.

 

추가로 스트라이드(Stride)는 입력데이터에 필터를 적용할 때 이동할 간격을 조절하는 것, 즉 필터가 이동할 간격을 말합니다. 스트라이드 또한 출력 데이터의 크기를 조절하기 위해 사용합니다. 스트라이드(Stride)는 보통 1과 같이 작은 값이 더 잘 작동하며, Stride가 1일 경우 입력 데이터의 Spatial크기는 Pooling계층에서만 조절하게 할 수 있습니다.

 

아래는 1폭 짜리 zero-padding과 stride값을 1로 적용한 뒤 합성곱 연산을 수행하는 예제입니다.

 

필터의 크기, 스트라이드, 패딩 유형은 신경망을 미세 조정할 수 있는 초매개변수입니다.

 


합성곱 계층 - 출력크기 계산

 

패딩과 스트라이드를 적용하고, 입력데이터와 필터의 크기가 주어졌을 때 출력 데이터의 크기를 구하는 식은 아래와 같습니다.

 

 

예를 들어 아래와 같은 내용이 있다고 가정하면, Padding이 1, Stride가 1일때의 출력데이터 크기를 구한다면 아래와 같습니다.

 


풀링 계층(Pooling Layer)

 

풀링 계층은 합성곱 계층의 패딩과 스트라이드처럼 데이터의 공간적 크기를 축약하는데 사용합니다. 주로 합성곱 계층에서 출력데이터의 크기를 입력데이터의 크기 그대로 유지하고, 풀링계층(Pooling Layer)에서만 크기를 조절합니다.

 

 

풀링에는 Max-Pooling과 Average-Pooling이 있는데 Max-Pooling은 해당영역에서 최대값을 찾는 방법이고, Average-Pooling은 해당영역의 평균값을 계산하는 방법입니다. 이미지 인식 분야에서는 주로 Max-Pooling을 사용합니다. 또한 풀링계층에서는 풀링의 윈도우 크기와 스트라이드 값은 값으로 설정한다.

 

아래와 같이 maxpooling을 텐서플로우에서 정의할 수 있습니다.

model.add(layers.MaxPooling2D((2,2))

 

 

 


텐서플로 2.x의 ConvNets

텐서플로우를 이용한 구현방법은 아래와 같습니다. 

하나의 입력 채널(또는 입력 필터)로 28 × 28 이미지에 3 × 3 컨볼루션을 적용해 32개의 출력 채널(또는 출력 필터)를 생성한다고 가정하면 아래와 같은 코드가 됩니다. 

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)))

 

 


ConvNets 요약

CNN은 시간 차원을 따르는 오디오와 텍스트 데이터의 경우 1차원, (높이 × 너비) 차원을 따르는 이미지의 경우 2차원, (높이 × 너비 × 시간)차원을 따르는 비디오의 경우 3차원으로 컨볼루션과 풀링작업을 적용한다.

 

이미지의 경우 입력 볼륨 위로 필터를 밀면 각 공간 위치에 대한 필터 반응을 제공하는 맵이 생성됩니다. 다시 말해 CNN에는 이미지 자체의 위치와 독립적으로 특정 시각적 특징을 이닉하는 방법을 배우는 여러 필터가 함께 쌓여 있습니다.

 

이러한 시각적 특징은 신경망 초기 계층에서는 단순하지만 신경망 속으로 들어가면서 점점 더 정교해진다. CNN을 훈련하려면 각 필터에 대한 올바른 값을 식별해야 여러 계층을 통과할 때 입력이 마지막 계층의 특정 뉴런을 활성화해 올바른 값을 예측할 수 있다.

반응형