06-6 CNN 필터링 스트라이딩 풀링 수치 예제

in #kr6 years ago (edited)

TensorFlow를 사용하여 CNN을 MNIST 수기 숫자 인식 문제를 다루어 보기 위한 준비 단계로서 아래 그림에서처럼 흑백 명암 픽셀로 구성된 단순 수치 이미지를 대상으로 CNN 코딩 절차를 간단히 따라가 보기로 한다. 코딩 연습이니까.

noname01.png

이 코딩 연습은 anaconda 가 설치된 윈도우즈10 PC를 기준으로 한다. 아나콘다 설치 시에 이 2가지 라이브러리 모듈은 default 로 설치된다.

noname02.png

이어지는 코딩에서 convolutional filter의 2X2 weight 을 1.0 으로 상수 값을 부여하고 shape을 출력해 보면 (2, 2, 1, 1) 이 출력되는데 파라메타들의 정의가 어떨게 되는지 정확히 알 수 가 없다. 추측컴데 2X2, 필터 수 1개, 사용 컬러 수 1개 아니가 한다. 차 후에 다른 예제를 살펴보고 알아내어야 할 듯하다.
TensorFlow에서 tf.conv2d() 명령을 사영하여 convolution fitering 작업을 실행한다. 이 명령 실행을 위해 필요한 데이터는 이미지 데이터 여기서는 image, 필터의 weight, 필터의 스트라이드 정보, padding 정보이다. 3X3 이미지에 2X2 필터인 경우 스트라이딩해 보면 경계선에서 딱 맞아 떨어지므로 별도로 padding을 해 줄 필요가 없다. padding 이라함은 스트라이드 후 경계선을 일부 넘어가게 되면 0.0 으로 채워 있는 것처럼 처리해 주는 기법인데 원래 convolutional filtering 처리 전의 이미지 크기와 처리 후 이미지 크기를 같게 즉 ‘SAME“ 하려면 필요하게 된다. 지금은 그럴 필요 없이 처리 후 원래의 3X3 보다 작은 2X2 매트릭스가 얻어지는 상태이며 ’VALID‘ 로 설정한다.

noname03.png

전체를 스트라이드하여 필터링 작업이 완료 되면 매트릭스 값이 3, 4, 6, 7 로 얻어지며 위에서처럼 4개의 셀에 명암으로 표현이 가능하다. 이 문제는 원래 이미지가 1,2,3,...,8,9 로서 특별한 기학학적 정보를 포함하지 않으므로 필터링 된 결과에 특별한 의미를 부여할 필요는 없디.
그 다음은 마찬가지 필터를 사용하되 padding 조건을 ‘SAME’으로 두고 처리하면 다음과 같이 원래 크기의 이미지가 얻어진다.

noname04.png

아울러 필터수를 3으로 늘려 보기로 한다. 필터가 3개라고 해서 필터별로 특별한 특성이 있는 것은 아니고 단지 숫자 크기만 1.0 대신 10.0 과 –1.0으로 바꾸어 보는 것이다.
특히 마이너스 값의 필터를 사용한 결과를 보면 가장 밝았던 부분이 가장 어두운 부분으로 가장 어두웠던 부분이 가장 밝게 바뀌었음을 알 수 있다.

noname05.png

그 다음 Pooling 과정을 알아보자. Pooling 이란 말그대로 대표를 뽑는 작업이며 주로 최대값을 가지는 픽셀을 선택한다. 물론 이미지가 추출한 특성을 손상하지 않아야 한다.

noname06.png

하단에 박스친 Fei Fei Li 가 CNN 자료에 자주 나타나는데 스탠포드 전산학과 여교수로서 2011년부터 ImageNet DB를 구축하고 이 DB를 대상으로 하는 정기적인 Contest를 통해 이미지 인식률을 50%선에서 90%선으로 끌어올린 업적의 주인공이다. 아울러 머신 러닝에서 자주 볼 수 잇는 Andrew NG도 스탠포드 교수였던 것 같은데 중국 바이두로 옮겼으며 아울러 현재 구글 브레인의 대표로 활동 중이다. 아마도 중국에서 인공지능의 발전을 위해 많은 인재들을 미국에서 스카웃함과 동시에 연구비를 특히 스탠포드에 투자하고 있는 듯하다.

Pooling 작업을 해보기로 한다. 전체 이미지가 2X2 로 주어졌을 때 ‘VAILD“ 조건하에서 2X2 매트릭스로 스트라이딩 시키게 되면 한번 올려 놓으면 최대 값 4를 주고 그대로 끝난다.
반면에 ‘SAME’ 조건을 적용하게 되면 가장자리 한줄을 보충하여 0을 입력한 상태의 3X3 매트릭스가 되므로 통 4회의 스트라이드를 적용할 수 있어 결과 2X2 매트릭스가 얻어진다.
그밖에 ReLU를 적용하는 문제도 있으나 ReLU 적용에 의해 픽셀의 최소값이 0 이상이 되면 이미지가 좀 밝아지는 효과가 있을 정도지만 기하학적 특징(feature) 추출과는 큰 상관이 없다. 단지 이어지는 Fully connected layers 와 연관하여 잘 수렴하는 결과를 줄 수 있도록 도움을 줄 수 있을 것이다.

noname07.png

다음 편에는 MNIST 의 숫자 하나를 택하여 필터링 및 풀링 작업을 한 결과를 코드와 함께 살펴보도록 하자.
지금까지의 코드 실행 연습은 너무나 재미가 없겠지만 이는 CNN을 경험해 보려면 반드시 통과해야 하는 의례 정도로 생각하면 될 듯하다. 이어지는 28X28 이미지를 다루는 MNIST 예제를 통해 이 코드들이 어떻게 활용되어 무려 99%의 인식률을 달성하는지 살펴보기로 한다.

첨부된 코드를 다운 받아 파라메터를 바꿔가면서 연습해 보자.

#exercise
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

sess = tf.InteractiveSession()
image = np.array([[[[1],[2],[3]],
[[4],[5],[6]],
[[7],[8],[9]]]], dtype=np.float32)
print(image.shape)
plt.imshow(image.reshape(3,3), cmap='Greys')

print("imag:\n", image)

print("image.shape", image.shape)
weight = tf.constant([[[[1.]],[[1.]]],
[[[1.]],[[1.]]]])
print("weight.shape", weight.shape)
conv2d = tf.nn.conv2d(image, weight, strides=[1, 1, 1, 1], padding='VALID')
conv2d_img = conv2d.eval()
print("conv2d_img.shape", conv2d_img.shape)
conv2d_img = np.swapaxes(conv2d_img, 0, 3)
for i, one_img in enumerate(conv2d_img):
print(one_img.reshape(2,2))
plt.subplot(1,2,i+1), plt.imshow(one_img.reshape(2,2), cmap='gray')

Sort:  

짱짱맨 호출에 응답하여 보팅하였습니다.

Coin Marketplace

STEEM 0.17
TRX 0.15
JST 0.028
BTC 62952.72
ETH 2429.38
USDT 1.00
SBD 2.56