NeuroWhAI의 잡블로그

[TensorFlow] 텐서보드 적용 본문

개발 및 공부/라이브러리&프레임워크

[TensorFlow] 텐서보드 적용

NeuroWhAI 2018. 1. 17. 18:56 ...


어제 했는데 오늘 쓰네요 ㅋㅋ
어제는 텐서보드를 사용해서 이전에 만든 모델을 텐서보드로 볼 수 있게 코드를 수정했습니다.
아, 또 학습데이터를 아래처럼 외부 파일로 분리시켰습니다.

data.csv
0, 0, 1, 0, 0
1, 0, 0, 1, 0
1, 1, 0, 0, 1
0, 0, 1, 0, 0
0, 0, 1, 0, 0
0, 1, 0, 0, 1
첫 두열이 x_data고 나머지가 y_data입니다.

main.py
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
63
64
65
66
67
68
69
import tensorflow as tf
import numpy as np
 
data = np.loadtxt('./data.csv', delimiter=',', unpack=True, dtype='float32')
 
x_data = np.transpose(data[0:2])
y_data = np.transpose(data[2:])
 
global_step = tf.Variable(0, trainable=False, name='global_step')
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
with tf.name_scope('layer1'):
    W1 = tf.Variable(tf.random_uniform([210], -1.01.0), name='W1')
    L1 = tf.nn.relu(tf.matmul(X, W1))
 
with tf.name_scope('layer2'):
    W2 = tf.Variable(tf.random_uniform([1020], -1.01.0), name='W2')
    L2 = tf.nn.relu(tf.matmul(L1, W2))
 
with tf.name_scope('output'):
    W3 = tf.Variable(tf.random_uniform([203], -1.01.0), name='W3')
    model = tf.matmul(L2, W3)
 
with tf.name_scope('optimizer'):
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
        labels=Y, logits=model
    ))
 
    optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
    train_op = optimizer.minimize(cost, global_step=global_step)
 
    tf.summary.scalar('cost', cost)
 
with tf.Session() as sess:
    saver = tf.train.Saver(tf.global_variables())
 
    ckpt = tf.train.get_checkpoint_state('./model')
    if ckpt and tf.train.checkpoint_exists(ckpt.model_checkpoint_path):
        saver.restore(sess, ckpt.model_checkpoint_path)
    else:
        sess.run(tf.global_variables_initializer())
 
    merged = tf.summary.merge_all()
    writer = tf.summary.FileWriter('./logs', sess.graph)
 
    for step in range(100):
        sess.run(train_op, feed_dict={X: x_data, Y: y_data})
 
        print('Step: %d, ' % sess.run(global_step),
            'Cost: %.3f' % sess.run(cost, feed_dict={X: x_data, Y: y_data}))
 
        summary = sess.run(merged, feed_dict={X: x_data, Y: y_data})
        writer.add_summary(summary, global_step=sess.run(global_step))
 
    saver.save(sess, './model/dnn.ckpt', global_step=global_step)
 
    prediction = tf.argmax(model, 1)
    target = tf.argmax(Y, 1)
    print('예측값:', sess.run(prediction, feed_dict={X: x_data}))
    print('실제값:', sess.run(target, feed_dict={Y: y_data}))
 
    is_correct = tf.equal(prediction, target)
    accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
    print('정확도: %.2f' % sess.run(accuracy * 100, feed_dict={X: x_data, Y: y_data}))
 
    
 
cs

이번에도 바뀐 부분만 해설!

학습 데이터를 외부로 뺐으므로 불러와야합니다.
numpy의 loadtxt로 쉽게 불러올 수 있었습니다.
unpack 매개변수를 True로 하면 데이터가 회전하게 됩니다.
그러니까 행렬이 바뀐답니다.
[
     [1, 2, 3],
     [4, 5, 6]
]
이랬다면
[
     [1, 4],
     [2, 5],
     [3, 6]
]
이렇게 되는거죠!
왜 이러냐면 데이터를 쉽게 분리하기 위해서입니다!
그 밑을 보시면 data[0:2]처럼 슬라이싱으로 쉽게 X 데이터와 Y 데이터를 분리할 수 있죠.
그런다음 np의 transpose 함수로 다시 행렬을 바꿔줍니다.

이전 글에서 global_step을 설명했나 모르겠네요.
이 값은 학습 횟수를 담을 변수인데 학습과는 상관이 없으므로 trainable이 False입니다.
optimizer의 minimize함수에 global_step 매개변수로 이 변수를 넘겨주면
최적화가 한번 실행될때마다 이 변수가 1 증가한다고 합니다.

그 다음은 신경망을 만들고있는데 텐서보드에서 좀 쉽게 보기위해서
각 레이어를 tf.name_scope로 그룹화하고 있습니다.

tf.summary.scalar('cost', cost)는 통계에 cost라는 이름으로 cost 변수를 넣겠다는 선언입니다.
텐서플로에 tf.Variable이 있다면 텐서보드엔 tf.summary가 있다는 느낌으로 보면 될것같습니다.

Saver를 사용해서 모델을 저장하고 다시 불러오는건 마지막에 설명하겠습니다.

tf.summary.merge_all()은 텐서플로에 global_variables_initializer()가 있다면 텐서보드엔 이게 있다...는 느낌입니다.
글로벌 통계 요소들을 전부 모아줍니다.
이 함수로 받은 merged를 세션에서 실행할때마다 데이터를 한번 기록하는거라 보면 될것같습니다.

FileWriter는 기록한 통계를 파일로 내보내줍니다.
생성할때 세션의 graph를 넣어주면 텐서보드에서 모델을 시각화해서 볼 수 있습니다.

학습을 100번 하는데 할때마다
merged 연산을 수행해서 추적하는 변수의 값을 기록하고
그렇게 만든 통계 데이터를 writer를 통해 파일에 추가로 기록합니다.

마지막으로 모델 재사용입니다.
다시 Saver가 있던 라인으로 돌아가서....
tf.Train.Saver로 모델을 저장하는 객체를 만듭니다.
모든 변수를 저장하도록 tf.global_variables()를 매개변수로 넣었습니다.

다음은 귀찮으니 대충 설명할겁니다.
지정한 경로에서 체크포인트 파일을 불러와서 모델의 경로를 알아낸다음
존재하면 saver.restore(...)로 모델을 복구합니다.
이때는 당연히 global_variables_initializer()를 수행할 필요가 없습니다.

학습을 끝내고 저장하려면
saver.save(...)를 호출합니다.
global_step 매개변수를 설정해주면 이 값이 파일이름에 붙는다고 합니다.


끝!
다음은 가브릴드롭아웃이던데... 벌써...?






7 Comments
  • 프로필사진 Favicon of https://neurowhai.tistory.com NeuroWhAI 2018.01.24 18:57 신고 정작 텐서보드 켜는 방법을 안적었네;; 죄송합니당..
    프로젝트 디렉토리에서 tensorboard --logdir=/로그_폴더
    하시면 됩니다.
  • 프로필사진 MonMon 2018.03.17 01:01 안녕하세요. 실습예제를 하다보니
    NotFoundError (see above for traceback): Key Variable_27 not found in checkpoint
    [[Node: save_6/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, ..., DT_INT32, DT_INT32, DT_INT32, DT_INT32, DT_INT32], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save_6/Const_0_0, save_6/RestoreV2/tensor_names, save_6/RestoreV2/shape_and_slices)]]

    계속 이런 에러가 떠서 댓글 남겨봅니다.

    model폴더에서 체크포인트 파일들을 지우지 않았을 때는 정확도 83.33으로 실행이 되지만
    그 다음 실행 때는 restore에서 불러오지를 못하는지 에러가 뜹니다.
    예상되는 정확도는 100이 되는것이구요..ㅠ 뭐가 문제일까요??
    제가 사용한 실습예제는 골빈해커 3분 딥러닝 5장-1의 예제입니다.
    혹시 몰라 메일주소도 남깁니다. 감사합니다.

    tjkueon@naver.com
  • 프로필사진 Favicon of https://neurowhai.tistory.com NeuroWhAI 2018.03.20 18:57 신고 저도 초보인지라 전체 코드가 없으면 원인을 찾기 힘듭니다 ㅠㅠ
  • 프로필사진 MonMon 2018.03.22 10:37 비밀댓글을 읽을 수가 없네요 ㅠㅠ 다시 적어주시거나 비밀을 풀어주실 수 있으신가요????
  • 프로필사진 Favicon of https://neurowhai.tistory.com NeuroWhAI 2018.03.23 08:30 신고 아.. 풀었습니다.
  • 프로필사진 MonMon 2018.03.23 09:07 이게 Jupyter notebook 커널 문제인건지 아니면 model 폴더에 생기는 checkpoint 문제인지 모르겠습니다.. ㅠㅠ 소스는 위의 작성하신 소스 그대로 긁어와서 해봐도 똑같은 현상이구요.. 대안?을 발견한건 커널을 클리어시키고 리스타트 시키면 model내 checkpoint를 생성하긴 하지만 정작 중요한 '학습'을 하는 것을 모르겠네요.ㅠㅠ 83.33인가?에서 유지되고 책처럼 100%까지 학습이 되질 않네요 흑흑
  • 프로필사진 daanswer 2018.07.11 14:35 혹시나 동일한 검색 루트로 타고 와서 보시는 분 있을까봐 댓글 남깁니다.
    Jupyter notebook 에서 동일한 현상이 생기시는 분은 그래프 중복 문제로 보입니다.
    저는 코드에 tf.reset_default_graph() 넣고 해결했습니다.

    참고: https://stackoverflow.com/questions/33765336/remove-nodes-from-graph-or-reset-entire-default-graph
댓글쓰기 폼