Post

(TensorFlow) TensorBoard

summaries_and_tensorboard

1
2
$ tensorboard --logdir=./tflogs/log-171113-1335 --port 8080

크게 다음 세가지 시각화를 지원한다.

  • Visualizing learning
  • Graph visualization
  • Embedding visualization

Visualizing learning

1.

시각화하고 싶은 노드를summary operations 의 인자로 넘기면 그래프에 summary operation이 추가된다. 아래의 경우 노드 logits에 tf.summary.histogram ops를 붙인다고 생각하면 된다.

1
2
3
logits\_hist = tf.summary.histogram('logits(output neuron)', logits)
accuracy\_scalar = tf.summary.scalar('accuracy', accuracy)

2.

기존 그래프가 실행될 때, 추가된 summary operations에 의존하지 않기 때문에 summary operations는 따로 run해줘야 한다. 약간 헷갈릴 수 있는데, 의존 관계를 갖고 있어 optimizer - cost - logit - W, b … 순으로 거슬러 올라가는 것을 생각해보면 된다. 아무튼, summary operations들을 한꺼번에 실행하기 위해 묶어주는 방법은 두가지다.

1
2
3
merged\_summary = tf.summary.merge\_all()                               #.... [I]
merged\_summary = tf.summary.merge(['logits\_hist', 'accuracy\_scalar']) #.... [II]

* merge_all() 시 merge되는 것은 변수가 공유되는 영역이다. [II] 처럼 output을 merge하는 식으로 작동하기 때문에, output이 존재하는 범위 밖에서 merge_all()하면 merge 되지 않는다.

* 또 하나 주의해야 할 점은 위 코드는실행될 때 마다 그래프에 Operation을 추가 한다 그래서 반복문 안에 위치해있으면 같은 Operation이 계속 그래프에 추가된다.

3.

summary operations이 run 되었을 때, 결과를 파일로 저장할 writer를 생성해둔다. graph는 선언하면서 지정해도 좋고, 따로 추가해도 된다. 아무튼 추가해야 실행이 된다.

1
2
3
writer = tf.summary.FileWriter('./tflogs/log-'+today, graph=sess.graph)
## writer.add\_graph(some.graph)    #graph를 따로 추가하는 경우.

  1. FileWriter를 graph에 추가하는 부분은 반드시 graph를 build하는 코드 뒤에 위치해야 한다.

즉, 먼저 graph가 build되고 나서 FileWriter가 graph에 추가되어야 graph visualization이 제대로 수행된다.

  1. 반복문 바깥에 위치해야 한다. 반복문 안쪽에 위치해 있으면 events 파일이 계속 생성된다.
4.

merged_summary를 실행하고 나온 결과를 writer에 넘기는데, 이 때 몇 step 째의 summary인지 함께 넘긴다.

1
2
3
s, \_ = sess.run([self.merged\_summary, self.optimizer], feed\_dict=feed\_dict)
writer.add\_summary(s, global\_step=step)

5.
1
2
$ tensorboard --logdir=./tflogs/log-171113-1335 --port 8080

InvalidArgumentError가 발생하는 경우

You must feed a value for placeholder tensor… 분명 feed_dict로 값을 넘겼는데 에러가 발생하는 경우가 있다. 이는 tf.summary.merge\_all()default graph 내에 존재하는 모든 summary operations 에 의존적인 Operation을 그래프에 추가하기 때문이다. 그래서 ensemble 학습에서 같은 세션에 모델이 둘 이상 존재하는 경우 에러가 발생할 수 있다. 같은 세션에 두 모델이 존재하는 경우, 한 세션에 한 그래프이기 때문에 두 모델은 같은 그래프에 존재하게 된다. 모델을 따로따로 실행시키게 되는데, 아직 실행되지 않은 다른 모델에 있는 summary operations를 계산하려다 feed_dict로 값이 입력되지 않았으니 에러가 발생하는 것. 해결 방법은 두 가지인데,

  1. tf.variable.scope()를 사용해 각 모델의 변수 영역을 구분하고, tf.summary.merge([summary\_variables])로 직접 변수를 merge하면 모델 별로 묶을 수 있다.
  2. Session에 각각 다른 graph를 지정해 생성한다.

with graph.as\_default():를 이용해 그래프를 지정해서 변수를 추가하고 merge한다. sess.run()시 Session에 등록된 graph를 실행하므로 변수 추가하고 merge할 때만 py as\_default()를 사용해주면 된다.

IPython을 사용하는 경우도 같은 이유로 에러가 발생할 수 있다.

Graph visualization

tf.name\_scope를 사용하면 그래프를 보여줄 때 각 name_scope 별로 묶어준다. 보통 with와 함께 사용하며 layer 단위로 묶게된다.

This post is licensed under CC BY 4.0 by the author.