[Tensorflow]16.Convolutional Neural Network(2)


Convolutional Neural Network(2)



이번 장에서는 convolution layer와 pooling layer를 tensorflow로 구현해보겠습니다~

예전에 했던 예제인 MNIST의 training image 중 하나를 보면서 어떻게 변화는지 확인해 볼게요!

먼저, MNIST의 image를 하나 가져오겠습니다~ 그리고 그 이미지를 보기위해 다음을 입력해줍니다.

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("MNIST_data/",one_hot=True)

img=mnist.train.images[0].reshape(28,28)
plt.imshow(img,cmap='gray')



그러면 3을 손으로 쓴 그림이 나오네요~!

image



이 이미지를 convolution, pooling 시켜보겠습니다!



Convolution layer



convolution layer는 filter를 이용하여 특징을 추출하는 층이였죠~~~
tensorflow에서 구현하는 방법입니다~

먼저, 이미지를 3차원 벡터로 reshape 시켜줍니다

sess=tf.InteractiveSession() #sess를 미리 선언하겠습니다.
img=img.reshape(-1,28,28,1) #이미지 3차원 벡터로 reshape



그 다음 filter를 선언해줍니다.

W1=tf.Variable(tf.random_normal([3,3,1,5],stddev=0.01))
#필터의 사이즈가 3 * 3 * 1이고 필터의 갯수는 5개  



그 다음 특징을 추출합니다. 즉, 필터를 이동시켜 범위마다 하나의 수를 꺼내옵니다.
구체적인 방법은,
원래 이미지에서 필터의 범위에 있는 각각의 수를 바로 앞에 있는 필터의 수와 곱해서 모두 더합니다.
그렇게 되면 범위마다 하나의 수가 나오게됩니다~

tensorflow에서는 conv2d 함수가 그 역할을 하는데요~ 다음과 같습니다.

conv2d=tf.nn.conv2d(img,W1,strides=[1,2,2,1],padding='SAME')

stride는 filter가 이동하는 정도라고 하였죠~~ strides=[ * , n , n , * ]이라면 필터를 가로로 n만큼 세로로 n만큼 이동시키면서,
수를 추출합니다.(위의 경우는 2씩 이동)
패딩기법은 input size와 output size를 같게 만들어준다고 하였습니다.
padding=’SAME’이면 strides=[1,1,1,1]인 경우 output size가 input size와 같게 해줍니다.
하지만 위의 경우는 strides=[1,2,2,1]이기에 output size는 input size의 반이 되버립니다.
(자세한 설명은 생략할게요~)



shape을 print 해보면 사이즈가 반으로 준 것을 확인할 수 있습니다.
28 * 28 * 3 -> 14 * 14 * 5 (depth는 필터의 갯수로 바뀝니다.)

image



이미 이미지를 Convolution 하는 것은 끝났습니다~!
제대로 되었는지 이미지를 출력해볼까요?? (자세한 코드는 모르셔도 무방합니다.)

image



각각 필터 5개에 의해 특징이 추출 된 상태입니다~~~

사이즈도 작아진 걸 보실 수 있습니다~!

위의 코드는 모르셔도 되고 이미지를 convolution 하기 위해서는 conv2d 함수를 이용하는 것만 기억해주세요~~!



Pooling layer



다음은 pooling 기법을 이용해보겠습니다.

pooling layer는 어떤 특정한 데이터에 치우쳐서 학습이 되지 않게 해준다고 하였습니다.

tensorflow에서는 주로 Max pooling을 사용합니다
Max pooling이란 주어진 범위에서 최댓값만 추출하는 것입니다.
최댓값만 사용하기에 이미지의 전부를 사용하지 않고 일부만 사용하는 거지요!

다음과 같이 구현합니다.

pool=tf.nn.max_pool(conv2d,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

ksize는 최댓값을 추출하는 필터의 크기라고 생각하시면 됩니다.
strides=[1,2,2,1]가 이므로 필터가 가로 2칸 세로 2칸 차례대로 움직이면서 최댓값을 추출합니다.
strides=[1,2,2,1]이고 padding=’SAME’이므로 output의 사이즈는 input의 사이즈의 반이 됩니다.



어떻게 변했는지 확인해볼까요?? (자세한 코드는 모르셔도 무방)

image



3을 형상화 한 손글씨가 형태를 알아볼 수 없게 변해버렸네요ㅋㅋㅋㅋ
이미지의 전부를 사용안하고 최댓값만 사용하여 그렇습니다!!!
학습은 더 잘 되니 걱정마세요~~~~~

이렇게 Convolution과 pooling 기법에 대해 알아보았는데요~~

CNN은 convolution layer와 pooling layer를 번갈아 사용하여 학습하는 기법입니다~!

다음 장에서는 CNN을 이용하여 MNIST를 다시 구현해보겠습니다~!
놀라운 결과 기대하세요!!