입력된 이미지를 Convlution 방법.
2)즉 필터를 통해 뽑아낸 값을 서브샘플링해서
3)그 특징을 뽑아내는 과정 (fully connected Net을 통해 classfication, regression할 수 있다.)
크게 두가지 부분으로 나눌 수 있다.
1) filter를 옆으로 stride만큼 움직인다.
2) 이걸 샘플링 과정을 통해 서브샘플링한다.
간단한 예시) 3x3의 1가지 색을 가진 이미지
이미지 만들기(1개의 이미지)필터 정의
[소스 코드]
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, 0, 3)
print(one_img.reshape(2, 2))
plt.subplot(1, 2, i+1), plt.imgshow(one_img.reshape(2, 2), cmap='gray')
Padding : Same으로 하면 결과가 같은 사이즈가 되도록 패딩을 해준다. (0 padding), Stride는 1x1
Stride가 2x2일 경우 결과는 절반이 된다(x/2 * x/2).
[소스 코드]
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='SAME')
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, 0, 3)
print(one_img.reshape(2, 2))
plt.subplot(1, 2, i+1), plt.imgshow(one_img.reshape(2, 2), cmap='gray')
[Filter를 여러 개 쓰는 소스 코드 ] - 필터를 여러 개 쓰면 하나의 이미지로부터 여러개의 이미지를 뽑아낼 수 있다.
print("image.shape", image.shape)
weight = tf.constant([[[[1.,10.,-1.]], [[1.,10.,-1.]]],
[[[1.,10.,-1.]],[[1.,10.,-1.]]]]) #Filter
print("weight.shape", weight.shape)
conv2d = tf.nn.conv2d(image, weight, strides=[1, 1, 1, 1], padding='SAME')
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(3, 3))
plt.subplot(1, 3, i+1), plt.imgshow(one_img.reshape(3, 3), cmap='gray')
아래 예제는 Max Pooling 전 후가 동일한 경우로 MNIST Image loading
from tensorflow.examples.tutorials.mnist import input_data
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt
import numpy as np
#데이터 읽어오기
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
#첫번째 있는 거 [0]를 읽어서 reshape
img = mnist.train.images[0].reshape(28, 28)
plt.imshow(img, cmap='gray')
sess = tf.InteractiveSession()
img = img.reshape(-1, 28, 28, 1) # 28*28의 한 색깔. 여러 개의 이미지가 있으니까 -1
W1 = tf.Variable(tf.random_noraml([3, 3, 1, 5], stddev=0.01)) #Weight을 맞게 3*3의 필터고 색상은 1개, 5개의 필터 사용
conv2d = tf.nn.conv2d(img, W1, strides=[1, 2, 2, 1], padding='SAME') #stride 2*2 (2칸씩 움직임)
print(conv2d)
sess.run(tf.global_variables_initializer())
#Conv 실행
conv2d_img = conv2d.eval()
conv2d_img = np.swapaxes(conv2d_img, 0, 3)
#그림 출력
for i, one_img in enumerate(conv2d_img):
plt.subplot(1, 5, i+1), plt.imshow(one_img.reshape(14, 14), cmap='gray')
# MAX Pooling
# 14*14 -> 7*7
pool = tf.nn.max_pool(conv2d, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
print(pool)
sess.run(tf.global_variables_initializer())
# 실행
pool_img = pool.eval()
pool_img = np.swapaxes(pool_img, 0, 3)
for i, one_img in enumerate(pool_img):
plt.subplot(1, 5, i+1), plt.imshow(one_img.reshape(7, 7), cmap='gray')
Stride가 2*2, Same이기 때문에 결과가 절반이 된다.
Max pooling을 이용한 subsampling