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를 수행한 것이다.

컬러를 넣어보면 아래와 같다. PCA결과 749이 유사한 것을 알 수 있다.
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

참고자료


+ Recent posts