AI & BigData/모두를 위한 딥러닝(정리)

텐서플로우(Tensor Flow) #13_ TensorBoard 사용하기

Tigercow.Door 2018. 4. 19. 15:29
728x90


안녕하세요. 문범우입니다.

우리가 지난번 실습에서 텐서플로우를 통해 Neural Network를 이용하여 XOR 문제를 풀어보았습니다.

그런데 우리가 Neural Network를 이용하면서 보다 깊고 복잡한 문제를 해결할 때 그 학습과정등을 시각적으로 볼 수 있도록 하는 Tensorboard라는 것이 있습니다.

이번 포스팅에서는 그런 Tensorboard를 사용하는 방법에 대해서 알아보도록 하겠습니다.


* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.

관련한 상세 내용은 아래 링크를 참고해주세요.

https://hunkim.github.io/ml/



1. Tensorboard


우선 텐서보드를 사용하면 위의 그림에서 보이는 것처럼 우리의 TensorFlow 그래프를 시각적으로 볼 수 있습니다.


그리고 cost에 관한 것도 그래프로 확인하면서 훈련이 잘 되고 있는지도 쉽게 확인할 수 있습니다.



텐서보드를 이용하기 위해서는 위와 같은 간단한 5가지 순서를 따라하면 됩니다.

실제로 지난 시간에 풀어본 XOR문제의 코드를 바탕으로 텐서보드를 사용해보도록 하겠습니다.



2. histogram & name_scope


먼저, 초기의 코드는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import tensorflow as tf
import numpy as np
 
x_data = np.array([[0,0], [0,1], [1,0], [1,1]], dtype=np.float32)
y_data = np.array([[0],   [1],   [1],   [0]], dtype=np.float32)
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
# W = tf.Variable(tf.random_normal([2,1]), name = "weight")
# b = tf.Variable(tf.random_normal([1]), name = "bias")
# hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
 
W1 = tf.Variable(tf.random_normal([2,10]), name="weight1")
b1 = tf.Variable(tf.random_normal([10]), name="bias1")
layer1 = tf.sigmoid(tf.matmul(X, W1) + b1)
 
W2 = tf.Variable(tf.random_normal([10,1]), name="weight2")
b2 = tf.Variable(tf.random_normal([1]), name="bias2")
hypothesis = tf.sigmoid(tf.matmul(layer1, W2) + b2)
 
 
# cost function / minimize cost
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
 
# predicate / accuracy
predicated = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicated, Y), dtype=tf.float32))
 
#
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for step in range(10001):
        sess.run(train, feed_dict={X: x_data, Y: y_data})
        if step%1000 == 0:
            print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run([W1, W2]))
    h, c, a = sess.run([hypothesis, predicated, accuracy], feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ",h,"\nCorrect: ",c,"\nAccuracy: ",a)
 
cs


이제 첫번째로 해야하는 것은, 우리가 그래프를 보기 위해 histogram을 이용하는 것과, 모델을 계층적으로 확인하기 위해 name_scope를 이용하는 것입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import tensorflow as tf
import numpy as np
 
x_data = np.array([[0,0], [0,1], [1,0], [1,1]], dtype=np.float32)
y_data = np.array([[0],   [1],   [1],   [0]], dtype=np.float32)
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
# W = tf.Variable(tf.random_normal([2,1]), name = "weight")
# b = tf.Variable(tf.random_normal([1]), name = "bias")
# hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
 
# name_scope 를 이용하여 계층별로 정리한다.
with tf.name_scope('layer1') as scope:
    W1 = tf.Variable(tf.random_normal([2,10]), name="weight1")
    b1 = tf.Variable(tf.random_normal([10]), name="bias1")
    layer1 = tf.sigmoid(tf.matmul(X, W1) + b1)
    # histogram을 이용하여 그래프를 확인할 수 있다.
    w1_hist = tf.summary.histogram('weight1',W1)
    b1_hist = tf.summary.histogram('bias1',b1)
    layer1_hist = tf.summary.histogram('layer1',layer1)
 
with tf.name_scope('layer2') as scope:
    W2 = tf.Variable(tf.random_normal([10,1]), name="weight2")
    b2 = tf.Variable(tf.random_normal([1]), name="bias2")
    hypothesis = tf.sigmoid(tf.matmul(layer1, W2) + b2)
 
    w2_hist = tf.summary.histogram('weight2', W2)
    b2_hist = tf.summary.histogram('bias2', b2)
    hypothesis_hist = tf.summary.histogram('hypothesis',hypothesis)
 
# cost function / minimize cost
with tf.name_scope('cost') as scope:
    cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
    cost_summ = tf.summary.scalar('cost',cost)
 
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
 
 
# predicate / accuracy
predicated = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicated, Y), dtype=tf.float32))
 
with tf.Session() as sess:
    # writer logs and show graph
    merged_summary = tf.summary.merge_all()
    writer = tf.summary.FileWriter('./logs/xor_logs_01')
    writer.add_graph(sess.graph)
 
    sess.run(tf.global_variables_initializer())
    for step in range(10001):
        sess.run(train, feed_dict={X: x_data, Y: y_data})
        if step%1000 == 0:
            # summary 실행
            summary, _ = sess.run([merged_summary, train], feed_dict={X: x_data, Y: y_data})
            writer.add_summary(summary, global_step=step)
 
            print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run([W1, W2]))
    h, c, a = sess.run([hypothesis, predicated, accuracy], feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ",h,"\nCorrect: ",c,"\nAccuracy: ",a)
 
cs


코드를 확인해보면, 14~36번줄에 name_scope를 이용하여 계층별로 묶어주고, 각각에서 histogram을 이용한 것을 확인할 수 있습니다.



3. add logs & show graph


이제 우리가 훈련시키는 모델에 대한 로그를 작성하고 그것을 그래프로 보여주도록 하는 코드를 작성합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import tensorflow as tf
import numpy as np
 
x_data = np.array([[0,0], [0,1], [1,0], [1,1]], dtype=np.float32)
y_data = np.array([[0],   [1],   [1],   [0]], dtype=np.float32)
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
# W = tf.Variable(tf.random_normal([2,1]), name = "weight")
# b = tf.Variable(tf.random_normal([1]), name = "bias")
# hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
 
# name_scope 를 이용하여 계층별로 정리한다.
with tf.name_scope('layer1') as scope:
    W1 = tf.Variable(tf.random_normal([2,10]), name="weight1")
    b1 = tf.Variable(tf.random_normal([10]), name="bias1")
    layer1 = tf.sigmoid(tf.matmul(X, W1) + b1)
    # histogram을 이용하여 그래프를 확인할 수 있다.
    w1_hist = tf.summary.histogram('weight1',W1)
    b1_hist = tf.summary.histogram('bias1',b1)
    layer1_hist = tf.summary.histogram('layer1',layer1)
 
with tf.name_scope('layer2') as scope:
    W2 = tf.Variable(tf.random_normal([10,1]), name="weight2")
    b2 = tf.Variable(tf.random_normal([1]), name="bias2")
    hypothesis = tf.sigmoid(tf.matmul(layer1, W2) + b2)
 
    w2_hist = tf.summary.histogram('weight2', W2)
    b2_hist = tf.summary.histogram('bias2', b2)
    hypothesis_hist = tf.summary.histogram('hypothesis',hypothesis)
 
# cost function / minimize cost
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
 
# predicate / accuracy
predicated = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicated, Y), dtype=tf.float32))
 
with tf.Session() as sess:
    # writer logs and show graph
    merged_summary = tf.summary.merge_all()
    writer = tf.summary.FileWriter('./logs/xor_logs_01')
    writer.add_graph(sess.graph)
 
    sess.run(tf.global_variables_initializer())
    for step in range(10001):
        sess.run(train, feed_dict={X: x_data, Y: y_data})
        if step%1000 == 0:
            print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run([W1, W2]))
    h, c, a = sess.run([hypothesis, predicated, accuracy], feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ",h,"\nCorrect: ",c,"\nAccuracy: ",a)
 
cs


위 코드의 43~45번 줄에 추가된 코드를 통해 로그를 작성하고, 그래프를 추가합니다.


그리고 각 step에서 세션을 실행시키고 우리가 그리고자 하는 그래프에 그 결과를 더해줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import tensorflow as tf
import numpy as np
 
x_data = np.array([[0,0], [0,1], [1,0], [1,1]], dtype=np.float32)
y_data = np.array([[0],   [1],   [1],   [0]], dtype=np.float32)
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
# W = tf.Variable(tf.random_normal([2,1]), name = "weight")
# b = tf.Variable(tf.random_normal([1]), name = "bias")
# hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
 
# name_scope 를 이용하여 계층별로 정리한다.
with tf.name_scope('layer1') as scope:
    W1 = tf.Variable(tf.random_normal([2,10]), name="weight1")
    b1 = tf.Variable(tf.random_normal([10]), name="bias1")
    layer1 = tf.sigmoid(tf.matmul(X, W1) + b1)
    # histogram을 이용하여 그래프를 확인할 수 있다.
    w1_hist = tf.summary.histogram('weight1',W1)
    b1_hist = tf.summary.histogram('bias1',b1)
    layer1_hist = tf.summary.histogram('layer1',layer1)
 
with tf.name_scope('layer2') as scope:
    W2 = tf.Variable(tf.random_normal([10,1]), name="weight2")
    b2 = tf.Variable(tf.random_normal([1]), name="bias2")
    hypothesis = tf.sigmoid(tf.matmul(layer1, W2) + b2)
 
    w2_hist = tf.summary.histogram('weight2', W2)
    b2_hist = tf.summary.histogram('bias2', b2)
    hypothesis_hist = tf.summary.histogram('hypothesis',hypothesis)
 
# cost function / minimize cost
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
 
# predicate / accuracy
predicated = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicated, Y), dtype=tf.float32))
 
with tf.Session() as sess:
    # writer logs and show graph
    merged_summary = tf.summary.merge_all()
    writer = tf.summary.FileWriter('./logs/xor_logs_01')
    writer.add_graph(sess.graph)
 
    sess.run(tf.global_variables_initializer())
    for step in range(10001):
        sess.run(train, feed_dict={X: x_data, Y: y_data})
        if step%1000 == 0:
            # summary 실행
            summary, _ = sess.run([merged_summary, train], feed_dict={X: x_data, Y: y_data})
            writer.add_summary(summary, global_step=step)
            
            print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run([W1, W2]))
    h, c, a = sess.run([hypothesis, predicated, accuracy], feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ",h,"\nCorrect: ",c,"\nAccuracy: ",a)
 
cs


52,53 번줄에서 그것을 수행합니다.



4. run tensorboard


이제 tensorboard를 실제로 실행시켜 그래프를 확인해보도록 하겠습니다.

터미널을 실행시켜서 아래와 같은 명령어를 입력합니다.


tensorboard -logdir=./logs/xor_logs_01


이때 명령어의 뒤에 있는 ./logs/xor_logs_01 은 우리가 로그 파일을 작성할때 경로와 파일 이름입니다.

물론 저는 터미널을 현재 파이썬 파일의 경로에 두고 실행시켰기 때문에 위와 같은 명령어로 진행했지만 다른 경로에서 명령어를 실행시키는 분들은 로그파일의 경로를 알맞게 작성해주셔야 합니다.



이렇게 실행시키고 웹 브라우저를 켜서 localhost:6006 또는 127.0.0.1:6006 으로 접속해보시면 tensorboard 창이 뜨고 여러가지 메뉴가 있습니다.

가장 쉽게 확인해 볼 수 있는 것은 아래와 같은 cost 그래프입니다.



cost가 학습을 하면서 0에 가까워지는 모습을 시각적으로 확인할 수 있으며 때문에, 우리의 모델이 제대로 훈련되었다고 생각해볼 수 있습니다.



5. Multiple runs


만약, learning rate를 서로 다르게한 두 모델을 비교해보고 싶다던가, 또 다른 요소를 다르게 한 모델을 서로 비교하여 한번에 tensorboard 에서 확인해보고 싶다면 아래와 같이 하면 됩니다.


위와 같이, 각각의 모델에 대해 로그파일을 만들고 tensorboard를 실행시킬때 그 로그파일들의 상위 경로를 입력하여 실행시킵니다.