TensorBoard : Neural Network

TensorBoard : Neural Network

텐서플로우에서 코드를 좀 더 직관적으로 보기 위해 tensorboard 를 공부했다.
이제 NN,CNN,RNN 예제를 텐서보드에서 구동시키기 위해 코드를 재작성해봤다.
NN과 CNN은 MNIST 예제를 이용했고 RNN은 아직 미정이다.

```python
import tensorflow as tf
import numpy as np
import input_data

def init_weights(shape, name):
    return tf.Variable(tf.random_normal(shape, stddev=0.01), name=name)

# This network is the same as the previous one except with an extra hidden layer + dropout
def model(X, w_h, w_h2, w_o, p_keep_input, p_keep_hidden):
    # Add layer name scopes for better graph visualization
    with tf.name_scope("layer1") as scope:
        X = tf.nn.dropout(X, p_keep_input)
        h = tf.nn.relu(tf.matmul(X, w_h))
    with tf.name_scope("layer2") as scope:
        h = tf.nn.dropout(h, p_keep_hidden)
        h2 = tf.nn.relu(tf.matmul(h, w_h2))
    with tf.name_scope("layer3") as scope:
        h2 = tf.nn.dropout(h2, p_keep_hidden)
        return tf.matmul(h2, w_o)

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels

X = tf.placeholder("float", [None, 784], name="X")
Y = tf.placeholder("float", [None, 10], name="Y")

w_h = init_weights([784, 625], "w_h")
w_h2 = init_weights([625, 625], "w_h2")
w_o = init_weights([625, 10], "w_o")

# Add histogram summaries for weights
w_h_simm = tf.histogram_summary("w_h_summ", w_h)
w_h2_summ = tf.histogram_summary("w_h2_summ", w_h2)
w_o_summ = tf.histogram_summary("w_o_summ", w_o)

p_keep_input = tf.placeholder("float", name="p_keep_input")
p_keep_hidden = tf.placeholder("float", name="p_keep_hidden")

py_x = model(X, w_h, w_h2, w_o, p_keep_input, p_keep_hidden)

with tf.name_scope("cost") as scope:
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(py_x, Y))
    train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost)
    # Add scalar summary for cost
    cost_summ = tf.scalar_summary("cost", cost)

with tf.name_scope("accuracy") as scope:
    correct_pred = tf.equal(tf.argmax(Y, 1), tf.argmax(py_x, 1)) # Count correct predictions
    acc_op = tf.reduce_mean(tf.cast(correct_pred, "float")) # Cast boolean to float to average
    # Add scalar summary for accuracy
    acc_summ = tf.scalar_summary("accuracy", acc_op)

with tf.Session() as sess:
    # create a log writer. run 'tensorboard --logdir=./logs/nn_logs'
    writer = tf.train.SummaryWriter("./logs/nn_logs", sess.graph)
    merged = tf.merge_all_summaries()

    # you need to initialize all variables
    tf.initialize_all_variables().run()

    for i in range(5):
        for start, end in zip(range(0, len(trX), 128), range(128, len(trX), 128)):
            sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end],
                                          p_keep_input: 0.8, p_keep_hidden: 0.5})
        summary, acc = sess.run([merged, acc_op], feed_dict={X: teX, Y: teY,
                                          p_keep_input: 1.0, p_keep_hidden: 1.0})
        writer.add_summary(summary, i)  # Write summary
        print(i, acc)                    # Report the accuracy
```

이 코드는 텐서플로우 튜토리얼에 코드가 있어서 딱히 고칠 게 없었다.

Scalar Graph


Accuracy 와 Cost scope를 정의해 session에서 실행시켰을 때 위와 같은 그래프를 가진다.
cost가 점점 줄어들고 accuracy가 점점 늘어나는 그래프를 볼 수 있다.
scalar_summary 함수를 이용해 텐서보드에서 볼 수 있다.


Graph


우선 간단한 코드의 흐름은 위 그래프와 같다. 
layer는 3개이고 cost 와 accuracy 라는 것을 알 수 있다.
위 그래프에서는 변수의 크기 흐름을 볼 순 없지만 
어디에 쓰이고 어떻게 쓰이는 지는 알 수 있다.

노드를 모두 펼친 그래프가 위와 같다.
텐서플로우 내장 함수들은 name 파라미터를 붙일 필요가 없다.
그래서 드랍 아웃이나 mat mul 같은 내장 함수는 자동으로 그래프에 추가된다.

weight histogram


weight의 숫자 변화를 히스토그램으로 볼 수 있는 기능이다.
histogram_summary 내장 함수를 이용해 텐서보드에서 볼 수 있다.

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리