Feature Extraction

이미지을 특징, 패턴으로 다양하게 데이터 셋을 해보고 모델을 구성해 데이터 셋 값을 모델에 넘겨보는 예제를 해보곘다.
Convolution
이미지을 특징, 패턴 데이터 SET

텐서플로우 케라스에서 제공해주는 Convolution을 통해 원하는 옵션 정의하고 그 옵션 설정값으로 이미지가 다양하게 나타내는 모델을 만들기까지 하겠다.
텐서플로우, 넘파이, 마플랏 각 라이브러리들을 불러온다.
import os
import tensorflow as tf
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
path = 'source/dog.jpg'
file = Image.open(path)
image = np.array(file)
# 이미지 앞에 차원수 늘리기
image[tf.newaxis, ...]
image.shape # 쉐이프 확인
tf.keras.layers.Conv2D(filters, kernel_size, strides, padding, activation)
tf.keras.layers.Conv2D 옵션 설명
filters: layer에서 나갈 때 몇 개의 filter를 만들 것인지 (a.k.a weights, filters, channels)
kernel_size: filter(Weight)의 사이즈
strides: 몇 개의 pixel을 skip 하면서 훑어지나갈 것인지 (사이즈에도 영향을 줌)
padding: zero padding을 만들 것인지. VALID는 Padding이 없고, SAME은 Padding이 있음 (사이즈에도 영향을 줌)
activation: Activation Function을 만들것인지. 당장 설정 안해도 Layer층을 따로 만들 수 있음
layer = tf.keras.layers.Conv2D(5,3,1,padding='SAME')
output = layer(image) # image 변수는 Image.open(path)을 통해 가져온 이미지
output.shape # 쉐이프 확인 (1, 734, 1100, fillter 값에 따른 변화)

이미지 확인 및 비교
plt.subplot(121)
plt.imshow(image, 'gray')
plt.subplot(122)
plt.imshow(output, 'gray')
plt.colorbar()
plt.show()

Activation Function
Convolution에서 사용되는 옵션을 미리 정의해둔 다음에 사용이 가능하다.

tf.keras.layers.ReLU
최소값, 최대값 구하기

act_layer = tf.keras.layers.ReLU() # 0 미만의 값을 전부 0으로 값을 바꾸는 엑티베이션 함수
act_output = act_layer(output)
act_output.shape

tf.keras.layers.ReLU() 는 0 미만 음수값을 전부 0으로 값을 바꾸는 엑티베이션 함수이기 떄문에 결과 후 최소값을 보면 0으로 바뀐 상태을 볼 수 있다.
이미지 확인 및 비교
plt.figure(figsize=(15,5))
plt.subplot(121)
plt.hist(act_output.numpy().ravel(), range=[-2,2])
plt.ylim(0,10000)
plt.subplot(122)
plt.imshow(act_output[0,:,:,0])
plt.colorbar()
plt.show()

Pooling
Convolution에서 필터을 통해 나눈 이미지를 원하는 옵션 값으로 압축하고 제일 큰 데이터 값들만 뽑는 것
MaxPool2D : https://www.tensorflow.org/api_docs/python/tf/keras/layers/MaxPool2D

pool_layer = tf.keras.layers.MaxPool2D(2, 2, padding='SAME')
pool_output = pool_layer(act_output)
pool_output.shape
위 코드 2번째 매개변수에 따라서 shape값이 달라진다. 예) 2일 경우 ½ 3일 경우 ⅓, 4일 경우 ¼

이미지 확인 및 비교
plt.figure(figsize=(15,5))
plt.subplot(131)
plt.hist(pool_output.numpy().ravel(), range=[-2,2])
plt.ylim(0, 10000)
plt.subplot(132)
plt.title(pool_output.shape)
plt.imshow(pool_output[0, :, :, 0], 'gray')
plt.subplot(133)
plt.title(act_output.shape)
plt.imshow(act_output[0, :, :, 0], 'gray')
plt.colorbar()
plt.show()

Fully Connected
모델 구성하기

Flatten
데이터 사이즈을 유지하면서 차원 수을 줄이는 것
flatten_layer = tf.keras.layers.Flatten()
flatten = flatten_layer(output)

이미지 확인 및 비교
plt.figure(figsize=(10, 5))
plt.subplot(211)
plt.hist(flatten.numpy().ravel())
plt.subplot(212)
plt.imshow(flatten[:,:100])
plt.show()

Dense
원하는 데이터 갯수을 받는 것
dense_layer = tf.keras.layers.Dense(32, activation='relu')
dense_output = dense_layer(flatten)
dense_output.shape


dense_layer2 = tf.keras.layers.Dense(64, activation='relu') # 64개의 relu 엑티베이션 함수에 데이터값
dense_output2 = dense_layer2(flatten)
dense_output2.shape

DropOut
매번 자동으로 학습될때마다 학습이 안되는 부분을 잘 되게 해주어 골구로 학습 하는것

drop_layer = tf.keras.layers.Dropout(0.7)
drop_output = drop_layer(dense_output)
drop_output.shape

Build Model
모델 구성 흐름 확인하기

from tensorflow.keras import layers
input_shape = (28, 28, 1)
num_classes = 10
inputs = layers.Input(input_shape)
net = layers.Conv2D(32, (3, 3), padding='SAME')(inputs)
net = layers.Activation('relu')(net)
net = layers.Conv2D(32, (3, 3), padding='SAME')(net)
net = layers.Activation('relu')(net)
net = layers.MaxPooling2D(pool_size=(2, 2))(net)
net = layers.Dropout(0.25)(net)
net = layers.Conv2D(64, (3, 3), padding='SAME')(net)
net = layers.Activation('relu')(net)
net = layers.Conv2D(64, (3, 3), padding='SAME')(net)
net = layers.Activation('relu')(net)
net = layers.MaxPooling2D(pool_size=(2, 2))(net)
net = layers.Dropout(0.25)(net)
net = layers.Flatten()(net)
net = layers.Dense(512)(net)
net = layers.Activation('relu')(net)
net = layers.Dropout(0.5)(net)
net = layers.Dense(num_classes)(net)
net = layers.Activation('softmax')(net)
model = tf.keras.Model(inputs=inputs, outputs=net, name='Basic_CNN')
model.summary()
