실습 환경은 Python 3.6과 tensorflow 1.5이다.
텐서보드(tensorboard)
텐서플로우에서 제공하는 기본 도구이다.
텐서보드를 이용하면 손실값, 정확도와 같은 결과값을 시각화하여 확인할 수 있다.
텐서보드를 이용하기 위해서는 모델을 다음과 같이 세팅해야 한다.
1. 계층을 name_scope로 묶기
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))
다음과 같이 tf의 name_scope 함수를 통해 계층을 묶고 이름을 붙일 수 있다. 이는 이후 텐서보드의 그래프에서 확인할 수 있다.
계층 뿐만이 아니라 플레이스홀더나 연산, 활성화 함수 등도 name_scope를 이용해 묶을 수 있다.
2. 손실값 추적을 위해 수집할 값(cost tensor) 지정
이는 최적화 이름 영역에서 진행한다.
with tf.name_scope('optimizer'):
# 손실
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(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)
스칼라 뿐 아니라 이미지/오디오, 히스토그램 등의 수집 또한 가능하다.
3. merged 변수에서 앞서 지정한 모든 텐서 수집, writer 변수에서 그래프와 텐서들의 값을 저장할 디렉토리 지정
merged = tf.summary.merge_all()
writer = tf.summary.FileWriter('./logs', sess.graph)
학습을 수행할 때 이 값들이 어떻게 쓰이는지 보자.
for step in range(100):
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))
merged에 모인 값은 매 단계에서 데이터값에 따라 연산된 결과를 summary에 저장하며, 이 결과값은 앞서 writer에 지정해준 디렉토리에 기록된다.
텐서보드의 실행
모델의 학습이 끝나고 나면, 지정한 디렉토리 logs가 생긴 것을 확인할 수 있다. terminal을 실행시켜 이 폴더의 상위 디렉토리로 이동한 뒤
tensorboard --logdir=./logs
다음과 같은 명령어를 입력해 주자. 그러면 http://locallhost:6006/ 이라는 주소를 출력해준다. 해당 주소는 텐서보드의 디폴트 포트 번호이다.
[SCALARS] 화면에서는 우리가 앞서 지정한 추적값인 Cost 값의 변화를 그래프로 보여주고 있다.
[GRAPHS] 화면에서는 앞서 지정한 name_scope들을 확인할 수 있다.
+ 가중치와 편향 등 다른 변수의 변화 또한 그래프로 확인하고 싶다면,
tf.summary.histogram("Weights", W1)
다음과 같은 코드를 추가하면 된다.