Tensorflow

Identify the role concept and parameters of each layer in TensorFlow


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에서 사용되는 옵션을 미리 정의해둔 다음에 사용이 가능하다.

ReLU 옵션 값

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()

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다