13기 혼공학습단을 끝내면서 과거의 ENTP적 기질로 일벌리는 걸 잘하는 나는 6개월 동안 변한 것이 없는 것 같다.

이렇게 여름 방학을 맞아 14기를 지원하는 것을 보면...

그래도 뭐 어쩌겠나 이미 신청한 것을 하다 보면 또 얻어가는 것과 성취감도 많겠지라는 생각을 하며,

14기 혼공단도 열심히 한번 해보도록 하자.

 

1. 최초의 CNN 모델

합성곱 신경망. 이름을 들으면 참 와닿지 않는다, 아무래도 전공자가 아니라면 해당 이름을 들어본적이 없을 것이다.

그렇다면 요즘 우리가 스마트폰에 없으면 아쉬운 기능인 FaceID 기능은 쉽게 알것이다. 바로 그 기능을 구현시켜주는 것이 CNN, 즉 합성곱 신경망(CNN) 이다.


(1) 최초의 CNN

CNN이 개발되기 전, 초기 형태는 페이스북의 얀 르쿤이 개발한 'LeNet' 이라는 것에 출발했다. 우편서비스에서 우편번호를 자동으로 인식하기 위해 이를 개발한 것인데, 이것이 지금까지 발전되어 우리는 현재 FaceID 등의 기술로 사용하고 있는 것이다.

 

(2) 인공신경망과 합성곱신경망

신경망이라는 단어는 사람의 뇌구조에서 한번쯤 들어 보았을 것이다. 즉, OO신경망 이라는 기술을 사람의 뇌구조를 그대로 본따 만든 기술이라 생각하면 된다. 우리는 일련의 사고과정을 통해 물체를 인식하고, 판단하고, 행동하는 것을 그대로 컴퓨터에서 할 수 있도록 했다는 말이다. 하지만 컴퓨터는 복잡한 인간의 사고과정을 이해할 수는 없으니, 용도와 목적에 따라 따로따로 분리하여 구조화 해두었는데 그 중, 우리가 한번쯤 들어본 '인공신경망(ANN)', 과 '합성곱신경망(CNN)'의 차이를 조금 알아보자.

 


- 인공신경망(Artificial Neural Network)

똑같은 신경망의 구조이지만 인공신경망은 텍스트 분류, 금융데이터 예측에 사용되는 신경망으로써 '입력층-은닉층-출력층' 구조를 거쳐 데이터를 처리한다. 

 

- 합성곱신경망(Convolutional Neural Network)

 이미지 처리를 위해 조금 더 특화한 인공신경망. '입력층-합성곱층-풀링층-밀집층' 의 세분화 된 층들을 거쳐 이미지를 분석하고 패턴을 학습할 수 있다. 

 

[합성곱 신경망 각 층의 역할]

합성곱층 : 이미지의 작은 부분을 스캔하여 핵심 특성을 추출하는 층이며, 합성곱계산을 통해 얻은 출력을 특성 맵이라 한다.

풀링층 : 특성 맵을 축소하여 처리 속도를 높이고 조금 더 중요한 특성에 집중하도록 하는 층

밀집증 : 추출된 특성을 바탕으로 최종 결과 도출하는 층. 추출된 이미지 패턴을 바탕으로 분류 작업 수행


 

2. 합성곱신경망의 층 만들기_[추가숙제]

(1) 합성곱층

파이썬의 Keras 라이브러리를 통해 우리는 쉽게 합성곱신경망의 레이어들을 만들어볼 수 있다. 합성곱레이어는 이미지를 입력으로 받았을 때, 돋보기로 하나하나 살펴보며 패턴을 찾아내는 층이라고 생각하면 된다. 합성곱레이어에서는 대표적인 매개변수를 이해해야한다. '필터 수', '필터 크기', '스트라이드', '패딩' 에 대해 하나씩 살펴보자.

 

- Filter(필터)

필터는 돋보기의 역할에 해당하는 것이라고 보면 쉽다. 그러면 우리는 돋보기를 통해 몇개의 특징을 추출할 것인지, 어떤 크기의 돋보기로 볼 것 인지에 대한 정의를 해주어야하는데, 그것이 바로 필터 수와 필터 크기에 대한 파라미터이다. 

 

- Stride(스트라이드)

스트라이드는 필터가 이동하는 칸 수를 말한다. 말그대로 돋보기가 차례차례 이미지를 훑고 지나갈건데, 하나하나씩 볼건지 몇개씩 건너 뛰면서 볼것인지를 결정해준다. 이때, 적절한 스트라이드를 설정하면 계산량을 줄이면서 중요한 정보를 추출 할 수 있다. 그러나 너무 작거나 크면 계산량이 너무 많아지거나 중요한 정보가 손실될 수 있다.

 

- Padding(패딩)

패딩이라는 것은 필터가 이미지를 훑으면서 가장자리의 정보는 완전히 덮을 수 없다. 이러한 문제로 출력 크기가 작아지고 가장자리에 해당하는 정보가 점점 소실되는데 이러한 점을 보완하는 파라미터이다. 기본적으로 Valid, Same 패딩이 있다.

 

import keras
from keras import layers
import numpy as np

#합성곱층 만들기
conv1= layers.Conv2D(filters=10, kernel_size=(3,3))

#합성곱층의 처리 과정
x = np.random.normal(size=(10, 28, 28, 1))
conv_out = conv1(x)
print(conv_out.shape)

#합성곱층의 파라미터 값에 따른 출력
conv2 = layers.Conv2D(filters=10, kernel_size=(3,3), strides=(2,2))
print(conv2(x).shape)

conv3 = layers.Conv2D(filters=10, kernel_size=(3,3), strides=(2,2), padding='same')
print(conv3(x).shape)

conv4 = layers.Conv2D(filters=10, kernel_size=(3,3), padding='same' )
print(conv4(x).shape)

 

 

(2) 풀링층

풀링레이어는 합성곱레이어에서 만들어진 특징맵을 받아 특징은 그대로 유지하면서 크기를 줄이는 층이다. 컴퓨터에서는 처리해야하는 데이터의 크기가 클수록 비효율적이고 복잡한데 이는 과적합의 위험이 있다. 하여 풀링층은 데이터의 크기를 줄여 계산을 감소시키고 과적합을 방지시킨다. 풀링 방법에는 평균과 최대 풀링 두가지가 있다. 이때 풀링층은 학습되는 가중치가 없어 새로운 특성맵을 만들지 않는다. 즉, 요약과 압충에 집중하는 레이어이다.

 

- 평균 풀링(Average Pooling)

평균 풀링은 지정된 크기의 영역에 있는 평균값을 사용한다.

 

- 최대 풀링(Max Pooling)

평균 풀링은 지정된 크기의 영역에 있는 최댓값을 사용한다.

 

 

(3) 밀집층

밀집층은  추출된 특징을 바탕으로 최종적으로 분류나 회귀등의 예측을 수행한다. 전형적으로 인공신경망처럼 작동하는 층이며 입력과 가중치의 dot product(내적)에 편향을 더하는 방식으로 값을 계산한다. 그리고 해당 값은 활성화 함수를 통해 결과를 마지막으로 조정하여 분류와 회귀를 수행한다.

 

3. 합성곱 연산

필자의 전공은 수학교육과 이므로, 조금 더 합성곱신경망에 대한 자세한 연산방식을 소개하려고 한다.  합성곱은 영어로 Convolution 라 하는데, 이는 수학에서 유용한 연산 방식이다. 합성곱은 다음과 같이 정의된다. 이때 함수 f를 우리가 입력하는 이미지의 값이라 생각하고, g를 커널이라고 생각하면 된다.

 

이때 t는 함수의 입력과 출력의 기준을 의미하는 것의 변수이며, 타우는 입출력을 이어주는 매개변수이다. 이러한 연산방식은 기본적으로 연속적인 값들이 입력(f)으로 주어졌을 때 우리가 적절한 함수 g를 잘 선택하여 컨볼루션 하게 되면 원하는 형태의 연속되는 신호를 출력값을 얻게 된다. 이러한 연산 특징을 이용하여 입력 값에 대하여 원하는 정보만을 추출할 수 있다.

4. [기본숙제] _keras/tensorflow 설치 하기 및 LeNet 그림그리기

+ Recent posts