본문 바로가기

코딩/텐서플로우

비전공자의 코딩 독학 - 파이썬&텐서플로우(8) <텐서보드>

반응형

안녕하세요.

오늘의 파이썬 코딩 독학 주제는 텐서보드 입니다.

 

 

1. 텐서보드란?

텐서보드는 텐서플로우에서

제공하는 학습 추적 툴입니다.

 

학습과정에서 변화하는 손실값이나

정확도, 가중치, 편향등을

다양한 방식으로 시각화 해주어

머신러닝을 더욱 쉽게 분석할 수 있게 해줍니다.

 

 

2. 전체 소스코드

import tensorflow as tf
import numpy as np

#데이터 불러오기
data = np.loadtxt('./data.csv', delimiter=',', unpack=True, dtype='float32')

#데이터 변환하기
x_data = np.transpose(data[0:2])
y_data = np.transpose(data[2:])

#학습 횟수 세어주는 변수 설정
global_step = tf.Variable(0, trainable=False, name='global_step')

#플레이스 홀더 설정
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

#계층 묶기
with tf.name_scope('layer1'):
    W1 = tf.Variable(tf.random_uniform([2,10], -1., 1.), name='W1')
    L1 = tf.nn.relu(tf.matmul(X, W1))

with tf.name_scope('layer2'):
    W2 = tf.Variable(tf.random_uniform([10,20], -1., 1.), name='W2')
    L2 = tf.nn.relu(tf.matmul(L1, W2))

with tf.name_scope('output'):
    W3 = tf.Variable(tf.random_uniform([20,3], -1., 1.), name='W3')
    model = tf.matmul(L2, W3)

with tf.name_scope('optimizer'):
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y, logits=model))

    optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
    train_op = optimizer.minimize(cost, global_step=global_step)
    
    #손실값 및 가중치 수집
    tf.summary.scalar('cost', cost)
    tf.summary.histogram('Weights', W1)

#세션 초기화 및 모델 불러들이고 저장
sess = tf.Session()
saver = tf.train.Saver(tf.global_variables())

#기존 모델 유무 확인 및 체크포인트 파일 생성
ckpt = tf.train.get_checkpoint_state('./model')
if ckpt and tf.train.checkpoint_exists(ckpt.model_checkpoint_path):
    saver.restore(sess, ckpt.model_checkpoint_path)
else:
    sess.run(tf.global_variables_initializer())

#텐서 수집 및 저장할 디렉터리 설정
merged = tf.summary.merge_all()
writer = tf.summary.FileWriter('./logs', sess.graph)

for step in range(2):
    sess.run(train_op, feed_dict={X: x_data, Y: y_data})

    print('Step: %d, ' % sess.run(global_step), 
          'Cost: %.3f' % sess.run(cost, feed_dict={X: x_data, Y: y_data}))
    
    #모아둔 텐서 값 계산 및 수집 후 저장
    summary = sess.run(merged, feed_dict={X: x_data, Y: y_data})
    writer.add_summary(summary, global_step=sess.run(global_step))

#최적화 끝난 후 학습된 변수들을 체크포인트 파일에 저장
saver.save(sess, './model/dnn.ckpt', global_step=global_step)

prediction = tf.argmax(model, 1)
target = tf.argmax(Y, 1)

print('예측값:', sess.run(prediction, feed_dict={X: x_data}))
print('실제값:', sess.run(target, feed_dict={Y: y_data}))

is_correct = tf.equal(prediction, target)
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print('정확도: %.2f' % sess.run(accuracy * 100, feed_dict={X: x_data, Y: y_data}))

 

 

3. 소스코드 설명

(1) 필요한 라이브러리를 탑재합니다.

import tensorflow as tf
import numpy as np

 

(2) 데이터파일을 만들어줍니다.

 

0, 0, 1, 0, 0

1, 0, 0, 1, 0

1, 1, 0, 0, 1

0, 0, 1, 0, 0

0, 0, 1, 0, 0

0, 1, 0, 0, 1

 

위 값은 1,2열이 성별을 나타내는 특징값이고,

3~5열이 나이대를 나타내는 분류값입니다.

 

위와같은 데이터를 아래와 같이 엑셀에 입력한 후

아래와 같이 다른이름으로 저장하기를 누릅니다.

이후 아래 사진과 같이 .csv 형식으로 저장해주면

데이터 저장이 완료됩니다.

 

(3) 학습을 위해 필요한 데이터를 불러옵니다.

data = np.loadtxt('./data.csv', delimiter=',', unpack=True, dtype='float32')

미리 저장해둔 데이터를 불러옵니다.

 

(4) 불러온 데이터를 가공해줍니다.

x_data = np.transpose(data[0:2])
y_data = np.transpose(data[2:])

1,2열의 데이터는 x_data로

3~5열의 데이터는 y_data로 변환해줍니다.

 

(5) 학습을 카운트 하기위한 변수를 설정합니다.

global_step = tf.Variable(0, trainable=False, name='global_step')

학습에 참여하지 않도록 하기 위해

trainable=False 옵션을 사용합니다.

 

(6) 플레이스 홀더를 설정합니다.

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

 

(7) 각 층을 블록으로 묶어줍니다. 

with tf.name_scope('layer1'):
    W1 = tf.Variable(tf.random_uniform([2,10], -1., 1.), name='W1')
    L1 = tf.nn.relu(tf.matmul(X, W1))

with tf.name_scope('layer2'):
    W2 = tf.Variable(tf.random_uniform([10,20], -1., 1.), name='W2')
    L2 = tf.nn.relu(tf.matmul(L1, W2))

with tf.name_scope('output'):
    W3 = tf.Variable(tf.random_uniform([20,3], -1., 1.), name='W3')
    model = tf.matmul(L2, W3)

with tf.name_scope('optimizer'):
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y, logits=model))

    optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
    train_op = optimizer.minimize(cost, global_step=global_step)

학습 추적시 식별을 용이하게 하기 위해

각 변수 뒤에 name='' 옵션을 사용해 이름을 붙여주고,

 

각 층을 블록으로 묶어 구분시켜줍니다.

 

(8) 값을 수집합니다.

    tf.summary.scalar('cost', cost)
    tf.summary.histogram('Weights', W1)

scalar함수는 값이 하나인 텐서를 수집할때 사용하고

histogram함수는 구간을 나눠 그래프를 그려줍니다.

여기서는 비용값을 스칼라로,

가중치를 히스토그램으로 조작해줍니다.

 

(9) 세션을 실행합니다.

sess = tf.Session()
saver = tf.train.Saver(tf.global_variables())

tf.global_variables()함수는

앞에서 정의한 변수들을 가져오는 함수입니다.
이후 tf.train.Saver()함수를 이용해서

가져온 변수들을 파일로 저장하거나

학습의 결과를 대입하는 변수로 사용합니다.

 

(10) 체크포인트 파일을 만들어줍니다.

ckpt = tf.train.get_checkpoint_state('./model')

if ckpt and tf.train.checkpoint_exists(ckpt.model_checkpoint_path):
    saver.restore(sess, ckpt.model_checkpoint_path)
else:
    sess.run(tf.global_variables_initializer())

우선 ./model디렉토리에

과거 학습해둔 모델의 유무를 확인하고

만약 과거의 모델이 있다면

saver.restore()함수로

과거의 값들을 불러오고,

아니면

sess.run()함수로 

변수들을 초기화합니다.

 

(11) 텐서들을 수집합니다.

merged = tf.summary.merge_all()

tf.summary.merge_all()함수로

앞서 지정된 텐서들을 수집합니다.

 

(12) 그래프와 텐서 값을 저장할 디렉토리를 설정합니다.

writer = tf.summary.FileWriter('./logs', sess.graph)

tf.summary.FileWriter()함수로

값들을 저장할 디렉토리를 지정합니다.

 

(13) 최적화를 진행합니다.

for step in range(2):
    sess.run(train_op, feed_dict={X: x_data, Y: y_data})

    print('Step: %d, ' % sess.run(global_step), 
          'Cost: %.3f' % sess.run(cost, feed_dict={X: x_data, Y: y_data}))

 

(14) 텐서 값들을 계산 후 저장합니다.

    summary = sess.run(merged, feed_dict={X: x_data, Y: y_data})
    writer.add_summary(summary, global_step=sess.run(global_step))

sess.run()함수로 수집된 값들을 계산한 후

writer.add_summary()함수로 계산된 값들을 저장합니다.

 

(15) 학습된 변수들을 체크포인트 파일에 저장합니다.

saver.save(sess, './model/dnn.ckpt', global_step=global_step)

saver.save()함수로 최적화가 끝나고,

학습된 변수들을 지정된 체크포인트파일에 저장합니다.

 

(16) 예측, 실제, 정확도 값을 출력합니다.

prediction = tf.argmax(model, 1)
target = tf.argmax(Y, 1)

print('예측값:', sess.run(prediction, feed_dict={X: x_data}))
print('실제값:', sess.run(target, feed_dict={Y: y_data}))

is_correct = tf.equal(prediction, target)
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print('정확도: %.2f' % sess.run(accuracy * 100, feed_dict={X: x_data, Y: y_data}))

 

 

 

4. 결과분석

코드를 두번 실행하면

아래와 같이 이전에 학습된 값에

이어서 학습할 수 있습니다.

학습이 진행될 수록 정확도가 높아지고 있습니다.

 

 

5. 텐서보드 사용하기

학습이 진행되고

데이터 파일들이 모두 저장되면

텐서보드를 사용할 수 있습니다.

 

(1) 명령어 입력하기

명령프롬프트에서 아래와 같은 명령어를 입력합니다.

tensorboard --logdir=저장위치

여기서 저장위치는

작성된 코드가 저장되어있는 폴더의 위치입니다.

 

(2) 서버 연결하기

인터넷 창을 여신 후

아래와 같은 주소를 입력합니다.

localhost:6006

 

아래 사진과 같은 화면이 나오면

텐서보드 구동에 성공하신겁니다.

 

이제 [SCALARS], [GRAPHS] 등의 항목을 눌러보시면

학습된 데이터들의 그래프를 확인하실 수 있습니다.

반응형