Hands on TensorBoard TensorFlow Dev Summit-2017
그냥 TensorFlow
를 이용해서 Graph
를 생성하게 되면 복잡한 모양을 나타낸다.
아래 예제에서 사용할 전체 코드는 구글 개발자가 작성한 코드를 동작하도록 약간 수정한 버전이 저의 아래 github에 있습니다.
https://github.com/leejaymin/TensorFlowLecture/blob/master/7.TensorBoard/mnist.py
아래와 같이 사용할경우 scoping이 없어서 복잡한 tensorBoard를 생성한다.
def conv_layer(input, size_in, size_out, name="conv"):
w = tf.Variable(tf.truncated_normal([5, 5, size_in, size_out], stddev=0.1))
b = tf.Variable(tf.constant(0.1, shape=[size_out]))
conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME")
act = tf.nn.relu(conv + b)
tf.summary.histogram("weights", w)
tf.summary.histogram("biases", b)
tf.summary.histogram("activations", act)
return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
Cleaning the Graph
- Node Names
- Name Scopes
Scope
과 name
을 설정한 코드는 아래와 같다.
def conv_layer(input, size_in, size_out, name="conv"):
with tf.name_scope(name):
w = tf.Variable(tf.truncated_normal([5, 5, size_in, size_out], stddev=0.1), name="W")
b = tf.Variable(tf.constant(0.1, shape=[size_out]), name="B")
conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME")
act = tf.nn.relu(conv + b)
tf.summary.histogram("weights", w)
tf.summary.histogram("biases", b)
tf.summary.histogram("activations", act)
return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
Variable
과 Placeholder
에도 Name
을 넣어 줘야 한다.
x = tf.placeholder(tf.float32, shape=[None, 784], name="x")
x_image = tf.reshape(x, [-1, 28, 28, 1])
tf.summary.image('input', x_image, 3)
y = tf.placeholder(tf.float32, shape=[None, 10], name="labels")
각각의 연산 step
에도 scoping
을 작성해 주어야 한다.
with tf.name_scope("train"):
train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)
with tf.name_scope("accuracy"):
correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.summary.scalar("accuracy", accuracy)
그다음 TensorBoard를 생성하면 좀 더 깔끔하게 그룹핑 되어서 그려지는것을 볼 수 있다.
Hyperparameter Search
- What about different learning rates ?
- What about different model architectures ?
TensorBoard
를 통해서 각각의 모델을 비교할 수 있다.
서로 다른 hyperparameter
를 assign
하고 이것을 비교해서 나타낼 수 있다.
아래와 같이 조건을 주고 여러번 실행 하면 된다.
def main():
# You can try adding some more learning rates
for learning_rate in [1E-4]:
# Include "False" as a value to try different model architectures
for use_two_fc in [True]:
for use_two_conv in [True]:
# Construct a hyperparameter string for each one (example: "lr_1E-3,fc=2,conv=2)
hparam = make_hparam_string(learning_rate, use_two_fc, use_two_conv)
print('Starting run for %s' % hparam)
# Actually run with the new settings
mnist_model(learning_rate, use_two_fc, use_two_conv, hparam)
Embedding Visualizer
high dimensional data를 3D-mentional data로 projection 시키는 것을 말한다.
Embedding
과 관련된 코드는 아래와 같다.
embedding = tf.Variable(tf.zeros([1024, embedding_size]), name="test_embedding")
assignment = embedding.assign(embedding_input)
config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()
embedding_config = config.embeddings.add()
embedding_config.tensor_name = embedding.name
embedding_config.sprite.image_path = LOGDIR + 'sprite_1024.png'
embedding_config.metadata_path = LOGDIR + 'labels_1024.tsv'
# Specify the width and height of a single thumbnail.
embedding_config.sprite.single_image_dim.extend([28, 28])
tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config)
각각을 file writer
를 이용해서 기록하게 된다.
if i % 500 == 0:
sess.run(assignment, feed_dict={x: mnist.test.images[:1024], y: mnist.test.labels[:1024]})
saver.save(sess, os.path.join(LOGDIR, "model.ckpt"), i)
500번
실행 될 때 마다 saver
를 이용해서 기록을 하게 된다.
model checkpoint는 모든 variable들과 임베딩 variable들을 포함하는 정보들을 가지고 있으며 이것을 아래의 경로에 저장하게 된다.tensorbard --logdir /tmp/mnist_tutorial
컬러를 넣어보면 아래와 같다. PCA
결과 7
, 4
, 9
이 유사한 것을 알 수 있다.Top 3 컴포넌트
만 표현한 것이다.
T-SNE
를 이용해서 분석하면 local similarity
를 판단할 수 있다.
이러한 유사도가 높은 이미지들은 생성한 classifier
가 잘못된 분류를 할 확률도 높아지게 된다.Embedding visualization
은 image
에서도 유용하지만 vocabulary
에 대해서도 유용하다.
아래는 smart-reply
에 대한 embedding 결과이다.
Future for TensorBoard
- TensorFlow Debugger Integration
- Plugins
- domain specific visualization
- Org-scale TensorBoard
참고자료
'AI > TensorFlow, PyTorch, Keras, Scikit' 카테고리의 다른 글
Tensorflow Object Detection API (SSD, Faster-R-CNN) (0) | 2017.07.16 |
---|---|
Convolutional Neural Network for CIFAR-10 (0) | 2017.06.18 |
Transitioning to TensorFlow 1.0 (0) | 2017.02.28 |
Tensor Board (0) | 2017.02.08 |
Early Stopping 및 Index Shuffling (0) | 2017.01.03 |