텐서플로우의 세션,그래프 그리고 함수의 개념
조대협 (http://bcho.tistory.com)
그래프와 세션에 대한 개념이 헷갈려서, 좋은 샘플이 하나 만들어져서 공유합니다.
텐서 플로우의 기본 작동 원리는 세션 시작전에 그래프를 정의해놓고, 세션을 시작하면 그 그래프가 실행되는 원리인데, 그래서 이 개념이 일반적인 프로그래밍 개념과 상의하여 헷갈리는 경우가 많다
즉, 세션을 시작해놓고 함수를 호출하는 케이스들이 대표적인데
http://bcho.tistory.com/1170 코드를 재 사용해서 이해해보도록 하자
이 코드를 보면, tt = time * 10 을 세션 시작전에 정의해놨는데, 이 코드를 함수로 바꾸면 아래와 같은 형태가 된다.
변경전 코드
def main():
print 'start session'
#coornator 위에 코드가 있어야 한다
#데이타를 집어 넣기 전에 미리 그래프가 만들어져 있어야 함.
batch_year,batch_flight,batch_time = read_data_batch(TRAINING_FILE)
year = tf.placeholder(tf.int32,[None,],name='year')
flight = tf.placeholder(tf.string,[None,],name='flight')
time = tf.placeholder(tf.int32,[None,],name='time')
tt = time * 10
summary = tf.summary.merge_all()
with tf.Session() as sess:
summary_writer = tf.summary.FileWriter(LOG_DIR,sess.graph)
try:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for i in range(5):
y_,f_,t_ = sess.run([batch_year,batch_flight,batch_time])
print sess.run(tt,feed_dict={time:t_})
#summary_str = sess.run(summary,feed_dict=feed_dict)
#summary_writer.add_summary(summary_str,i)
summary_writer.flush()
변경후 코드
def create_graph(times):
tt = times * 10
return tt
def main():
print 'start session'
#coornator 위에 코드가 있어야 한다
#데이타를 집어 넣기 전에 미리 그래프가 만들어져 있어야 함.
batch_year,batch_flight,batch_time = read_data_batch(TRAINING_FILE)
year = tf.placeholder(tf.int32,[None,],name='year')
flight = tf.placeholder(tf.string,[None,],name='flight')
time = tf.placeholder(tf.int32,[None,],name='time')
r = create_graph(time)
summary = tf.summary.merge_all()
with tf.Session() as sess:
summary_writer = tf.summary.FileWriter(LOG_DIR,sess.graph)
try:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for i in range(5):
y_,f_,t_ = sess.run([batch_year,batch_flight,batch_time])
print sess.run(r,feed_dict={time:t_})
#summary_str = sess.run(summary,feed_dict=feed_dict)
#summary_writer.add_summary(summary_str,i)
summary_writer.flush()
변경후 코드는 tt = times * 10 을 create_graph라는 함수로 뺐는데, session 시작전에 함수를 호출한다. 언뜻 보면 개념이 헷갈릴 수 있는데, time 이라는 변수는 텐서플로우의 placeholder로 값이 읽혀지는 시점이 queue_runner를 시작해야 값을 읽을 수 있는 준비 상태가 되고, 실제로 값을 큐에서 읽으려면 session을 실행하고 feed_dict를 이용하여 feeding을 해줘야 값이 채워지기 때문에, 일반적인 프로그램상으로는 session을 시작한 후에 함수를 호출해야할것 같이 생각이 되지만, 앞에서도 언급했듯이 텐서플로우에서 프로그래밍의 개념은 그래프를 다 만들어놓은 후 (데이타가 처리되는 흐름을 모두 정의해놓고) 그 다음 session을 실행하여 그래프에 데이타를 채워놓는 개념이기 때문에, session이 정의되기 전에 함수 호출등을 이용해서 그래프를 정의해야 한다.
'빅데이타 & 머신러닝 > 머신러닝' 카테고리의 다른 글
머신러닝 모델 개발 삽질기 (0) | 2017.04.24 |
---|---|
머신러닝 라벨 데이타 타입에 대해서 (0) | 2017.04.10 |
텐서플로우-배치 처리에 대해서 이해하자 (2) | 2017.04.03 |
연예인 얼굴 인식 서비스를 만들어보자 #2-CSV에 있는 이미지 목록을 텐서로 읽어보자 (4) | 2017.03.15 |
연예인 얼굴 인식 서비스를 만들어보자 #1 - 학습 데이타 준비하기 (2) | 2017.03.14 |