머신러닝

1-8 라즈베리 파이 TensorBoard를 활용한 cost 함수 그래픽 출력과 코드의 GRAPH 구성 분석

coding art 2017. 12. 24. 16:46
728x90

                               


아래에 기술된 내용은 사실 가장 간단한 머신 러닝 예제에서 출발하여 설명하지만 후반에 TensorFlow를 지원하는 강력한 툴의 하나인 TensorBoard 사용법을 첨부하였다. 물론 TensorBoard 사용법이 처음 초보자에게는 다소 복잡하게 느껴질지도 모르지만 반드시 숙지해야 할 내용이며 만약 예제가 좀 더 복잡해진다면 설명 자체가 너무 번잡해 질 수도 있으므로 반드시 이 예제를 통해 TensorBoard  사용법을 어는 정도 익혀 두기 바란다.

가장 간단하면서도구체적인 수치 예제로서   3개의 점 데이터 (x1,y1), (x2,y2), (x3,y3)를 각각 (1.0,1.0), (2.0,2.0), (3.0,3.0)으로 둔 다음 cost 함수를 아래와 같이 유도하였다.



이 cost 함수는 독립 변수인 weight w와 바이어스 b 의 2차식 형태의 함수로 구성된다. 이 식을 w에 관한 완전 제곱 형태로 정리해 보자.



이와 같이 제곱 항의 합으로 구성된 cost 함수의 최소값은 각각의 제곱 항이 0 인 경우에 얻어진다. 즉  w = 1-(3/7)b 와 동시에  b = 0 이므로  w = 1 인 동시에 b = 0 이며 결국 y = x 가 되며 cost 함수의 최소값은 0 이 됨을 알 수 있다.

한편 이번에는 앞서서 계산하였던 linear_regression.py를 바탕으로 TensorBoard에 의해 학습과정에서 경사 하강법을 사용함에 따라 지속적으로 계산되는 cost 함수 값을 Tensor Board 의 기능을 사용 추적하여 저장한 후 웹에서 가시적인 그래프를 관찰해 보기로 한다. 비록 이 문제는 아주 단순하므로 구태여 TensorBoard 사용법을 적용할 필요성을 못 느낀다하나 본격적인 머신러닝 코드를 실행할때를 대비해서 그 사용법을 알아볼 필요가 있다.


numpy  모듈은 리스트 와 어레이 데이터 처리를 지원한다.

학습을 시키기 위한 입력 데이터는 np.linspace(0,3,3) 명령을 사용하여 0 으로부터 3 까지를 3 등분하여 리스트 데이터를 생성하는데 그 결과는 x_train=[1,2,3] 과 동일하다. 아울러 y_train 데이터는 그대로 입력하자.
경사 하강법을 적용함에 있어서 W 와 b 는 처음에 난수로 설정한다.

with∼name_scope(‘⚫⚫⚫’) 를 사용하여 TensorBoard에 적용할 파라메터의 명칭을 설정한다. 이 명칭은 변수에서 사용하는 name=’⚫⚫⚫’과는 별도임에 유의한다.




Least square 처리를 위한 loss 함수는 최종적으로 cost 함수로 설정될 것이다. learning rate은 0.01 그대로 사용하도록 하여 학습을 시키도록 한다. global_variables_initializer()를 불러 전역 변수를 초기화 하고 Session을 설정하여 실행시키다.

with∼name_scope(‘cost’) 를 사용하여 TensorBoard에 적용할 최종 명칭 즉 cost를 설정하는데 이는 앞서 학습시킨 loss 함수가 바로 cost 함수가 된다. 아울러 학습 횟수 epoch 는 200회로 설정한다.

마지막 단계에서 summary.merge_all() 명령을 실행하여 TensorBoard 에서 사용할 정보를 모은 후 결과를 저장할 디렉토리 경로를  ./logs/printout 으로 설정한다. ./logs/는 라즈베리 파이 상의 디렉토리 경로를 뜻하며 실제로는 터미날 창에서 tensorboard 명령을 실행함에 있어 아래와 같이 정확한 경로를 지정하여야 한다.



마지막으로 cost 외에 현재 코드 전체의 구성을 나타내는 graph를 보기위해서 sess.graph를 추가한다.

파이선 코드를 실행한 후에 터미널 창에서 디렉토리 경로를 cd /home/pi/⚫⚫⚫/logs/printout 으로 변경한 후에 다음의 tensorboard 명령을 실행한다.



Starting TensorBoard ⚫⚫⚫
(You can navigate to
http://127.0.1.1:6006) 이 출력되면 인터넷을 열고 해당 request 주소를 입력하고 enter 처리하면 TensorBoard 화면이 나타난다. 여기에서 빨간 색 박스 친 부분을 확인 할 필요가 있다.




cost를 클릭하면 epoch에서 설정한 200회에 걸친 cost 함수 값의 변화를 볼 수 있다. 이 기능은 learning rate α 값 설정과 관련하여 대단히 중요한 역할을 한다.


그 외에도 sess.graph도 추가하여 코드의 세밀한 GRAPH 구조를 살펴보기로 한다.











코드의 GRAPH 정보는 TensorBoard에서 GRAPHS 버튼을 클릭하여 나타나는 정보를 살펴보기로 하자.









with∼name_scope(input’) 문에서 정의된 노드 input은 2개의 노드 ‘inputX’ 와‘inputY’ 와 연결된다. 3개의 출력이 있는데 각각 ‘model’,‘loss’ 및 ‘gradients’에 제공된다. ‘gradients’는 코드에 직접적으로 나타나 있지 않은데 TensorFlow를 사용할 때에 내부적으로 항상 등장하는 듯 하다.



weight w 와 바이어스 b 의 초기 값은 난수(random_normal())에 의해 생성되며 이 2개의 변수 데이터를 사용하여 Y_pred  값을 계산하여 ‘model’ 에 귀속시킨다. 이 ‘model’에서 계산된 정보는 최소자승법 계산을 위해 ‘loss’로 넘겨진다.
‘loss’는  ‘model’이 제공하는 Y-pred 값과 ‘input’ 이 제공하는 데이터를 사용하여 cost 함수 값을 계산하여 ‘gradients’에 넘겨준다. ‘gradients’는 ‘model’이 제공하는 정보와 loss’가 제공하는 정보를 취합하여 경사하강법(Gradient Decent)을 위한 데이터를 생성하게 된다.


linear_reg_tensorboard_01.py


import numpy as np 

import tensorflow as tf

import matplotlib.pyplot as plt


#input data:

x_train=np.linspace(0,3,3)

y_train=[1,2,3]


#model parameters of Weight and Bias

W = tf.Variable(tf.random_normal([1]), name='weight')

b = tf.Variable(tf.random_normal([1]), name='bias')


with tf.name_scope('input'):

 X=tf.placeholder(tf.float32, name='InputX')

 Y=tf.placeholder(tf.float32, name='InputY')


#model

with tf.name_scope('model'):

   Y_pred=X*W + b


#loss

with tf.name_scope('loss'):

     loss = tf.reduce_mean(tf.square(Y_pred -Y ))

     

#training algorithm

optimizer = tf.train.GradientDescentOptimizer(0.01)

train = optimizer.minimize(loss)


#initializing the variables;init = tf.initialize_all_variables() #for TF version < 1.0

init=tf.global_variables_initializer()


#starting the session session 

sess = tf.Session()

sess.run(init)

with tf.name_scope('cost'):

    cost = tf.summary.scalar("loss", loss)


merged_summary_op = tf.summary.merge_all()

#summary_writer = tf.summary.FileWriter('./logs/printout', graph=tf.get_default_graph())

summary_writer = tf.summary.FileWriter('./logs/printout')

summary_writer.add_graph(sess.graph)


sess.run(init)

epoch=200


for step in xrange(epoch):

    _, c, summary=sess.run([train, loss, merged_summary_op], feed_dict={X: x_train, Y: y_train})

    summary_writer.add_summary(summary,global_step=step)

    if step%5==0:

     print c

print "Model paramters:"       

print "Weight:%f" %sess.run(W)

print "bias:%f" %sess.run(b)