We-Co

[We-Co] TensorBoard - 학습과정 시각화, Tensorflow 본문

Python/Tensorflow

[We-Co] TensorBoard - 학습과정 시각화, Tensorflow

위기의코딩맨 2021. 10. 5. 12:18
반응형

안녕하세요. 위기의코딩맨입니다.

오늘은 TensorBoard에 관해 간단하게 알아보도록 하겠습니다.

 

TensorFlow로 학습을 진행하면서

Log나 학습과정을 한눈에 알아보기 힘든 문제점이 있었습니다.

이러한 학습과정을 시각화에 도움을 주는 TensorBoard라는 기능이 있습니다.

저는 구글에서 제공하는 Colab을 사용하여 진행했습니다.

 

[출처: https://www.tensorflow.org/tensorboard?hl=ko]

해당 이미지와 같이 작업을 진행하면 

Epoch이 반복될 때마다 Loss가 감소하는지, 정확도가 증가하는지 등

원하는 값을 찾아가고 있는지 도움을 주는 기능을합니다.

 

 

TensorBoard에서는 가장 많이 사용되는 3가지의 API를 설명드리겠습니다. 

 

- tf.summary.scalar

Scalar의 값 형태의 로그를 저장하는 기능을 제공하고

Loss 값이나, 정확도의 값을 저장하는 역할을 합니다.

 

- tf.summary.histogram

아래의 이미지와 같이 로그 값을 저장합니다.

 

히스토그램

- tf.summary.image

이미지 형태로 로그를 저장합니다.

 

[ TensorBoard 로그 저장 ]

 

TensorBoard 로그를 저장 방법은 

summart_File의 인자를 생성하고, 인자 값을 받아 File 형태로 로그를 저장합니다.

 

summary_File = tf.summary.create_file_writer('/tensorboard_Log') 

 

with summary_File.as_default():

    tf.summary.scalar('loss',loss, step=optimizer.iterations)

 

여기서 중요한것은 scalar로 사용한 예제이지만, 사용하려는 API를 사용할 수 있습니다.

해당 파일을 생성 완료했다면,

 

터미널(CMD)을 열어 명령어를 입력합니다.

tensorboard --logdir= LogPath

tensorboard는 텐서플로 설치할 때, 같이 설치가 되므로 사용 가능합니다. 

입력하시고 나면 URL창에

localhost:6006 을 입력해서 텐서보드 기본 웹브라우저에 접속하시면 됩니다.

 

[ 예제 ]

예제는 MNIST CNN예제를 통해 알아보도록 하겠습니다.

 

import 후, MNIST 예제 데이터를 다운받고

x_train, x_test의 타입을 float32 타입으로 변경하고, 해당 28*28의 형태를 갖고 있는 이미지를

784차원으로 Flattening 작업을 진행합니다.

그리고 x_tain, y_test의 [0,255]사이의 값들을 [0, 1]로 변경하기위해 255로 나누어 주도록합니다.

마지막으로 해당 데이터를 one-hot Encoding을 적용합니다

import tensorflow as tf

 

(X_Train,Y_Train),(X_Test,Y_Test) = tf.keras.datasets.mnist.load_data()

X_Train,X_Test = X_Train.astype('float32'), X_Test.astype('float32')

X_Train, X_Test = X_Train.reshape([-1,784]), X_Test.reshape([-1784])

X_Train, X_Test = X_Train/255., X_Test/255.

Y_Train, Y_Test = tf.one_hot(Y_Train, depth= 10), tf.one_hot(Y_Test, depth= 10)

 

 

tf.data API를 이용하여 60000개의 데이터를 섞고 50개의 배치를 적용합니다.

train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train))

train_data = train_data.repeat().shuffle(60000).batch(50)

train_data_iter = iter(train_data)

  

CNN Model을 정의합니다.

class CNN(tf.keras.Model):

  def __init__(self):

    super(CNN, self).__init__()

    # Convolution layer 

    # 5 X 5 kernel Size / 32개 Filter

    self.Conv_Layer_1 = tf.keras.layers.Conv2D(filters=32, kernel_size=5, strides=1, padding='same', activation= 'relu')

    self.Pool_Layer_1 = tf.keras.layers.MaxPool2D(pool_size=(2,2), strides =2)

 

    # Convolustion Layer 2

    # 5 X 5 kernel Size / 64개 Filter

    self.Conv_Layer_2 = tf.keras.layers.Conv2D(filters=64, kernel_size=5, strides=1, padding='same', activation= 'relu')

    self.Pool_Layer_2 = tf.keras.layers.MaxPool2D(pool_size=(2,2), strides =2)

 

    # Fully Connected Layer

    # 7 X 7 크기 64개의 activation map 1024개로 변환

    self.Flatten_Layer = tf.keras.layers.Flatten()

    self.FC_Layer_1 = tf.keras.layers.Dense(1024, activation='relu')

 

    # Output Layer

    # 1024개 특징을 10개의 클래스 one-hot-encoding으로 표현된 숫자로 변환

    self.Output_Layer = tf.keras.layers.Dense(10, activation=None)

  

  def call(selfx):

    #MNIST 데이터를 3차원 형태로 reshape

    X_Image = tf.reshape(x, [-128281])

    # 28X28X1을 28X28X32로 변환, -> 14X14X32

    Conv_1 = self.Conv_Layer_1(X_Image)

    Pool_1 = self.Pool_Layer_1(Conv_1)

    # 14X14X32를 14X14X64 변환, -> 7X7X64

    Conv_2 = self.Conv_Layer_2(Pool_1)

    Pool_2 = self.Pool_Layer_2(Conv_2)

 

    #7X7X64 -> 1024

    Pool_2_Flat = self.Flatten_Layer(Pool_2)

    FC_1 = self.FC_Layer_1(Pool_2_Flat)

 

    # 1024 -> 10

    Logits = self.Output_Layer(FC_1)

    Y_Pred = tf.nn.softmax(Logits)

    return Y_Pred, Logits

 

 

최적화 Adam(0.00001)으로 정의해줍니다.

optimizer = tf.optimizers.Adam(1e-4)

 

 

Cross Entropy Loss함수를 정의하고,

def Cross_Entropy_Loss(LogitsY):

  return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=Logits, labels=Y))

 

 

TensorBoard Summary 정보/ 저장할 폴더 경로 설정 및 FileWriter를 설정해주도록 합니다.

Train_Summary_Write = tf.summary.create_file_writer('./TensorBoard/Train')

Test_Summary_Write = tf.summary.create_file_writer('./TensorBoard/Test')

 

 

매 step마다 tf.summary.scalar, tf.summary.image 텐서보드 로그를 기록하게 됩니다.

def train_step(modelxy):

  with tf.GradientTape() as tape:

    y_pred, logits = model(x)

    loss = Cross_Entropy_Loss(logits, y)

  with Train_Summary_Write.as_default():

    tf.summary.scalar('loss', loss, step=optimizer.iterations)

    x_image = tf.reshape(x, [-128281])

    tf.summary.image('training image', x_image, max_outputs=10, step=optimizer.iterations) 

  gradients = tape.gradient(loss, model.trainable_variables)

  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

 

 

설정한 모델의 정확도를 나타내는 함수를 정의하도록합니다.여기서 Summary_writer를 추가로 받아 호출되는 시점마다 accuracy의 이름으로 accuracy를 저장하는 진행합니다. Tensorboard에서는 그래프형태로 출력됩니다.

def Compute_Accuracy(Y_PredYSummary_writer):

  correct_pr = tf.equal(tf.argmax(Y_Pred,1), tf.argmax(Y,1))

  accuracy = tf.reduce_mean(tf.cast(correct_pr, tf.float32)) 

  with Summary_writer.as_default():

    tf.summary.scalar('accuracy',accuracy, step= optimizer.iterations)

  return accuracy

 

 

해당 모델을 선언하고, 1000번의 학습을 진행하도록합니다.

50번마다 정확도를 출력하고, summary를 저장하도록 설정하였습니다.

CNN_Model = CNN()

for i in range(1000):

  batch_x, batch_y = next(Train_Data_Iter)

  if i % 50 == 0:

    train_accuracy = Compute_Accuracy(CNN_Model(batch_x)[0], batch_y, Train_Summary_Write)

    print("Epoch: %d, Train data 정확도: %f" % (i, train_accuracy))

  train_step(CNN_Model, batch_x,batch_y) 

print("정확도(Accuracy): %f" % Compute_Accuracy(CNN_Model(X_Test)[0], Y_Test, Test_Summary_Write))

 

정확도 출력

 

저는 구글에서 제공하는 코랩을 사용하여 진행했습니다.

코랩에서는 코드로도 Tensorboard를 가져올 수 있습니다.

load_ext로 tensorboard를 선언해주고, 예제에서 실행했던 

Train_Summary_Write = tf.summary.create_file_writer('./TensorBoard/Train')

Test_Summary_Write = tf.summary.create_file_writer('./TensorBoard/Test')

선언해주었던 경로를 밑에서 가져오면 됩니다.

 

%load_ext tensorboard 

%tensorboard --logdir {'./TensorBoard/Train'}

 

해당 코드를 입력해서 실행하면 밑에 TensorBoard가 실행됩니다.

SCALARS 탭에서 accuracy로 저장했던 정확도가 학습을 통해서 높아지는 것을 확인할 수 있습니다.

학습에 문제가 없는 것으로 보여집니다! loss도 학습을통해 줄어드는 것을 확인할 수 있습니다.

TensorBoard SCALAS

 

다음 IMAGES 탭에서는 트레이닝 이미지를 확인할 수 있습니다.

TensorBoard Image

 

이상으로 CNN MNIST를 활용해서 학습을 진행하고,

학습 진행 상황을 TensorBoard를 활용해서 시각화하는 방법을 알아보았습니다.

점점 내용이 많아지고 공부할 것도 늘어나는 기분...

반응형