In [25]:
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
In [3]:
from tensorflow.keras import datasets
(train_x,train_y),(test_x,test_y) = datasets.mnist.load_data()
In [4]:
#모든 작업을 하기전에 shape로 이미지 인지 문자인지 확인해줘야한다.
image=train_x[0]
image.shape
Out[4]:
(28, 28)
In [5]:
plt.imshow(image,'gray')
plt.show()
In [6]:
image = image[tf.newaxis,...,tf.newaxis]
image.shape
Out[6]:
(1, 28, 28, 1)
Feature Extraction(특징,패턴) + classification(예측)¶
필터:layer에서 나갈때 몇개의 filter를 만들건지 ( weights,filters,channels) kernal_size : filter(weight)의 사이즈
In [11]:
#tf.keras로 필터를 편리하게 지정가능
tf.keras.layers.Conv2D(filters=3,kernel_size=(3,3),strides=(1,1),padding="SAME",activation='relu')
#padding 이미지 사이즈 변함없음(VALID), SAME(패딩이 있음,사이즈에 영향을준다)
Out[11]:
<tensorflow.python.keras.layers.convolutional.Conv2D at 0x14a3118c790>
In [12]:
tf.keras.layers.Conv2D(3,3,1,'SAME') #위의 거라 같음
Out[12]:
<tensorflow.python.keras.layers.convolutional.Conv2D at 0x14a311a9070>
In [14]:
image = tf.cast(image,dtype=tf.float32)
image.dtype
Out[14]:
tf.float32
In [16]:
layer = tf.keras.layers.Conv2D(3,3,1,padding='SAME')
layer
Out[16]:
<tensorflow.python.keras.layers.convolutional.Conv2D at 0x14a3190b190>
In [21]:
output = layer(image)
output.shape
Out[21]:
TensorShape([1, 28, 28, 3])
In [26]:
np.min(output),np.max(output)
Out[26]:
(-360.57632, 318.42963)
In [27]:
plt.subplot(121)
plt.imshow(image[0,:,:,0],'gray')
plt.subplot(122)
plt.imshow(output[0,:,:,0],'gray')
plt.show()
In [31]:
#위에서 설정한 layer의 weight 확인하기
weight=layer.get_weights()
len(weight),weight #앞에있는건 weight 뒤의건 bias
weight[0].shape, weight[1].shape
Out[31]:
((3, 3, 1, 3), (3,))
In [41]:
plt.figure(figsize=(15,5))
plt.subplot(141)
plt.hist(output.numpy().ravel(),range=[-2,2])
plt.ylim(0,100)
plt.subplot(142)
plt.title('original')
plt.imshow(image[0,:,:,0],'gray')
plt.subplot(143)
plt.title(weight[0].shape)
plt.imshow(weight[0][:,:,0,0],'gray')
plt.subplot(144)
plt.title(output.shape)
plt.imshow(output[0,:,:,0],'gray')
plt.colorbar()
plt.show()
#숫자 5 이미지가 중간이미지인 weight를 적용해서 오른쪽 이미지로 변한것이다.
In [45]:
#relu는 0이하는 모두 0으로 죽이고, 0이상은 y=weight * x로 가공
act_layer = tf.keras.layers.ReLU()
act_output = act_layer(output)
In [47]:
act_output
Out[47]:
<tf.Tensor: shape=(1, 28, 28, 3), dtype=float32, numpy=
array([[[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
...,
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
...,
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
...,
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
...,
[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
...,
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
...,
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
...,
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]]]], dtype=float32)>
In [48]:
np.min(output),np.min(act_output)
#기존의값은 -360인데 relu를 적용한것은 0이하는 전부 0으로 만들어서 최솟값이 0이다.
Out[48]:
(-360.57632, 0.0)
In [50]:
plt.figure(figsize=(15,5))
plt.subplot(121)
plt.hist(act_output.numpy().ravel(),range=[-2,2])
plt.ylim(0,100)
plt.subplot(122)
plt.imshow(act_output[0,:,:,0],'gray')
plt.show()
pooling(압축)¶
이미지를 받으면 지정한 값만큼 반토막낸다고보면된다. 보통(2,2)를 씀 4 -> 2
In [51]:
tf.keras.layers.MaxPool2D(pool_size=(2,2),strides=(2,2),padding='SAME')
Out[51]:
<tensorflow.python.keras.layers.pooling.MaxPooling2D at 0x14a3e9c2f40>
In [52]:
pool_layer=tf.keras.layers.MaxPool2D(pool_size=(2,2),strides=(2,2),padding='SAME')
pool_output=pool_layer(act_output)
In [53]:
act_output.shape
Out[53]:
TensorShape([1, 28, 28, 3])
In [57]:
pool_output.shape
Out[57]:
TensorShape([1, 14, 14, 3])
In [66]:
plt.figure(figsize=(15,5))
plt.subplot(131)
plt.hist(pool_output.numpy().ravel(), range=[-2, 2])
plt.ylim(0,100)
plt.subplot(132)
plt.title('relu 필터를 통과한 이미지 오리지널')
plt.imshow(act_output[0,:,:,0],'gray')
plt.subplot(133)
plt.title('기존 이미지 데이터를 pooling한 결과')
plt.imshow(pool_output[0,:,:,0],'gray')
plt.colorbar()
plt.show()
In [ ]:
728x90
반응형
'AI > 머신러닝' 카테고리의 다른 글
[Tensorflow] 4. MNIST 모델 학습 및 예측 (0) | 2021.06.22 |
---|---|
[Matplotlib] 번외. matplotpib 한글폰트 깨짐 해결 (0) | 2021.06.18 |
[Tensorflow] 2.Tensorflow기본 DataSet (MNIST) (0) | 2021.06.18 |
[Tensorflow] 1. Tensorflow의 기본 Tensor (0) | 2021.06.17 |
[Tensorflow] Tensorflow란? (0) | 2021.06.17 |