Data Science/Tensorflow2.0, Pytorch

4. Tensorflow2.0 Layer Explaination

HJChung 2020. 3. 25. 21:35

이번에는  Tensorflow modeling을 하기 전에 layer을 각 층마다 보면서 어떻게 작동하는지를 tensorflow를 사용해서 볼 것입니다. 

즉, 

1. layer에 어떻게 data가 input되고, 

2. 결과는 어떻게 output되는지 시각화를 진행해 보고

3. 어떻게 layer을 쌓는지 

를 알아보도록 합니다. 

 

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

%matplotlib inline


########여기는 이전에 했던 진행했던 코드들 입니다. #########

#데이터 불러오기
from tensorflow.keras import datasets
(X_train, y_train), (X_test, y_test) = datasets.mnist.load_data()

#X_train 데이터 살펴보기
X_train.shape
X_train[..., tf.newaxis]

image = X_train[0]

#y_train 데이터 살펴보기
label = y_train[0]

from tensorflow.keras.utils improt to_categorical
onehot_label = to_categorical(label)  

#시각화
plt.title(onehot_label)
plt.imshow(image)
plt.show()

###################################

 

Layer들이 모인 model은 Feature Extraction과 Classification으로 나눌 수 있습니다. 

우선 Feature Extraction에 대해서 알아보도록 하겠습니다. 

1.  Layer의 역할 개념 파악 

1) 우선 Convolution layer 에 대해

keras의 layers에서 제공하는 것으로 tf.nn보다 더욱 간편하게 구현할 수 있습니다. 

import tensorflow.keras.layers import Conv2D
Conv2D(filters = 3, kernel_size = (3, 3), strides = (1, 1), padding ='SAME', activation = 'relu')

#위의 코드를
Conv2D(3, 3, 1, 'SAME', 'relu')
#로 해도 동일합니다. 

 

2) layer에 어떻게 data가 input되는지

를 알아보려고 합니다. 

1. 데이터 타입 변환

우선 image data가 int이면 Model로 들어 갈 시, 에러가 발생하기 때문에 데이터 타입을 변환해 줍니다.

image = tf.cast(image, dtype = tf.float32)

2. layer을 생성

layer = Conv2D(3, 3, 1, padding = 'SAME')

3. layer에 input넣고, 결과로 output 나옴

output = layer(image)

 

3) 결과는 어떻게 output되는지 시각화를 진행

이때 모든 channel을 다 시각화 할 수 없으므로 2차원인 (height, width)만 시각화해줍니다.

#원본과 Conv2D layer의 output 결과와 비교

plt.subplot(1, 2, 1)
plt.imshow(image[0, :, : 0], 'gray')

plt.subplot(1, 2, 2)
plt.imshow(output[0, :, :, 0], 'gray')

 

2.  Feature activation Layer의 파라미터 파악

1)  Convolution layer의  Weight 보기

.get_weights() 를 사용하면 해당 layer의 weight를 리스트로 받게 되고, 알 수 있습니다.

weight = layer.get_weights()
weight

weight[0].shape #이건 weight의 shape이고, 
weight[1].shape #이건 bias의 shape 입니다. 

#이를 시각화해서 보면
plt.figure(figsize = (15, 5))

plt.subplot(1, 3, 1)
#output 결과값을 히스토그램을 통해 보려면 .numpy().ravel()을 이용해서 일렬로 쭉 핀 후 시각화를 진행합니다. 
plt.hist(output.numpy().ravel(), range = [-2, 2])
plt.ylim(0, 100)

#weight값을 시각화 
plt.subplot(1, 3, 2)
plt.imshow(weight[0][0, :, :, 0], 'gray')

#output 이미지를 시각화
plt.subplot(1, 3, 3)
plt.imshow(output[0, :, :, 0], 'gray')

plt.colorbar()
plt.show()

3. Activation Function

1) ReLU 함수를 적용시킨다고 한다면,

tf.keras.layers.ReLU()

act_layer = tf.keras.layers.ReLU()
act_output = act_layer(output)

#결과를 시각화 해보면
plt.figure(figsize = (10, 5))

plt.subplot(2, 1, 1)
plt.hist(act_output.numpy().ravel())

plt.subplot(2, 1, 2)
plt.imshow(act_output[:, :100], 'jet')

plt.show()

4. Dense (Fully Connected)

from tensorflow.keras.layers import Dense

layer = Dense(32, activation = 'relu') # 몇 개를 input을 받은 걸 32개로 연결하여 output 할 것 이다 라는 의미입니다. 

output = layer(act_output)