랩탑으로 tensorflow 도전하기 - tutorial

45
TensorFlow hands-on 세세 2017.02.14 세세세

Upload: lee-seungeun

Post on 21-Feb-2017

646 views

Category:

Data & Analytics


5 download

TRANSCRIPT

Page 1: 랩탑으로 tensorflow 도전하기 - tutorial

TensorFlow hands-on 세션2017.02.14

이승은

Page 2: 랩탑으로 tensorflow 도전하기 - tutorial

TensorFlow 실행

• 아무것도 안 뜨는 경우 , docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow 실행• token 값은 복사해서 메모장에 붙여놓기

• docker 가 존재하는 경우 , docker exec -it CONTAINER_ID / bin/bash 실행

docker ps 로 프로세스 존재 유무 확인

Docker 종료 시 , Ctrl-P, Ctrl-Q 로 종료해야함 . Ctrl-C 안됨 !

Page 3: 랩탑으로 tensorflow 도전하기 - tutorial

Hands-on 은 설명을 듣는 것보다는 손으로 직접 짜보는 게 훨씬 훨씬 중요합니다 .

그래서 이번 시간에는 설명을 최소화하여 직접 손으로 해보고 Q&A 를 진행하도록 하겠습니다 .( 여기 있는 코드는 이미지라 붙여넣기 어차피 안됩니당…꼭 직접 해보세용 !!)

Page 4: 랩탑으로 tensorflow 도전하기 - tutorial

TensorFlow 를 잘 활용하기 위해서는 Python 에 대한 이해와

Python 과 연관된 Jupyter, NumPy 와 같은 툴에 대한 이해도 필요합니다 . ( 그러나 Python 이나 NumPy 는 양이 너무 많아서… 설명보단 코딩을 하며 서서히 익히는 걸로… .)

물론 C++ API가 제공되고 있고 ,추후 Go 와 Java 가 제공 예정이지만… 가장 많이 쓰는 건 역시 Python 이므로 !

Page 5: 랩탑으로 tensorflow 도전하기 - tutorial

00. Jupyter

Page 6: 랩탑으로 tensorflow 도전하기 - tutorial

Jupyter: interactive 하게 python 을 실행해볼 수 있는 좋은 web UI 제공

Jupyter 에서 만든 notebook(jupyter 의 파일 기본 단위 ) 의 확장자

각종 파일 및 이미지를 올릴 수 있음새로운 파일 및 폴더 생성 가능 .python 노트북과 터미널을 제일 많이 쓰게 됨

현재 사용 중인 노트북 상태

( 구 iPython)

Page 7: 랩탑으로 tensorflow 도전하기 - tutorial

Running 되고 있는 notebook 이 너무 많으면 속도를 위해 shutdown 시켜줄 필요가 있음

터미널은 ‘ exit’ 없이 창만 닫을 경우 계속 running 상태임 . shutdown 클릭을 통해 손쉽게 종료 가능

Page 8: 랩탑으로 tensorflow 도전하기 - tutorial

Markdown 으로 코드 사이사이 문장이나 그래프를 사용할 수 있음

Code 를 적고 실행하면 바로 결과가 나옴

자주 사용하는 기능들이니 한번씩 눌러서 기능을 확인해보세요

Page 9: 랩탑으로 tensorflow 도전하기 - tutorial

01. Basic

Page 10: 랩탑으로 tensorflow 도전하기 - tutorial

Tensorflow 코드의 시작 : 필요한 library 를 import 하자 !가장 많이 쓰는 삼형제 : tensorflow, numpy, matplotlib• NumPy: a package for scientific computing with Python 로 N-

dimensional array object 에 특화됨• Matplotlib: 2D plotting library 로 Python script 나 jupyter

notebook 에서 많이 쓰임

마지막 줄은 matplotlib 을 Notebook 에서 보기 위한 명령어

Page 11: 랩탑으로 tensorflow 도전하기 - tutorial

가장 먼저 computational graph 정의와 실행의 분리 이해 !• a = a + 1 인 그래프를 정의하여 , 1,2,3 값을 출력하기lazy computing

잊지마세요 . session.run() 이 되어야 비로소 꽃이 될 수 있음을 !

a=0a=a+1

a=a+1 로 업데이트하는 그래프를3 번 반복하기

shift + Enter 결과 보기

Page 12: 랩탑으로 tensorflow 도전하기 - tutorial

가장 먼저 computational graph 정의와 실행의 분리 이해 !• a = a + 1 인 그래프를 정의하여 , 1,2,3 값을 출력하기

놀라셨죠… ? 이렇게 나와서…

Page 13: 랩탑으로 tensorflow 도전하기 - tutorial

Variable 를 쓴다면 반드시 해야하는 초기화 (initialization)• 다른 operation 이 수행되기 전에 명시적 초기화 (explicit initialization) 가

필수적임• 모든 variable 들을 초기화시키는 명령어 활용

sess 선언 바로 뒤에 sess.run(tf.global_variables_initializer()) 추가

Page 14: 랩탑으로 tensorflow 도전하기 - tutorial

Variable 를 쓴다면 반드시 해야하는 초기화 (initialization)• 다른 operation 이 수행되기 전에 명시적 초기화 (explicit initialization) 가

필수적임• 모든 variable 들을 초기화시키는 명령어 활용

잉 ? 어째서… ?

Page 15: 랩탑으로 tensorflow 도전하기 - tutorial

Variable 은 동시에 읽고 쓰기가 가능하다 !만약 동시적인 읽기 / 쓰기를 막기 (lock 만들기 ) 위해서는 assign 을 활용하자

혹시 여기서 궁금하신 거 없나요 ?예를 들면 , sess.run(update) 와 sess.run(a) 의 차이가 무엇인지 ?

Page 16: 랩탑으로 tensorflow 도전하기 - tutorial

tf.Session.run() 과 fetch

tf.Session.run(fetches, feed_dict=None, options=None, run_metadata=None)• fetch 는 말 그래도 ‘ ( 어디를 가서 ) 가지고 [ 불러 ] 오다’라는 뜻 . • Session.run() 은 fetch 에 해당하는 operation 을 수행하고 수행 후 tensor 값을

전달함temp

a

1

update

a+1

a+1이것만 run 하면수행될 op 이 음슴… 이걸 run 하면 a+1 op 과 그 결과를 a 에 assign 하는 op 이 수행됨

Page 17: 랩탑으로 tensorflow 도전하기 - tutorial

print(a) vs. print(sess.run(a)) vs. print(a.eval())• print(a) 는 a 라는 tensor 에 대한 정보 (rank, shape, dtype) 를 제공함• 따라서 값을 fetch 하기 위해서는 sess.run(a) 를 출력해야하고 이에 대한 축약

버전이 a.eval() 임

Page 18: 랩탑으로 tensorflow 도전하기 - tutorial

이제 이 그림을 tensorflow 로 표현해봅시다

Page 19: 랩탑으로 tensorflow 도전하기 - tutorial

Computational graph 정의• 데이터를 읽는 두 placeholder a,b 를 정의하고• a, b 를 더하는 c 를 정의하고• b 에서 1 을 빼는 d 를 정의하고• c 와 d 를 곱하는 e 를 정의함

여기서 잠깐 , placeholder 란 ?• 데이터를 읽는 방법에는 3 가지가 있는데 그 중 제일 많이 쓰이는 feeding 시 필수적으로 정의되는 tensor 임

• Feeding 은 그래프의 시작 뿐 아니라 중간 tensor 에서도 데이터를 넣을 수 있다는 특징 때문에 reading from file 방법이나 preloaded data 방법과 차별화됨• Placeholder 는 데이터를 가지고 있는 게 아니라 나중에 feeding 으로 받는 것을 전달하는 것이기 때문에 초기화가 필요 없음 . 만약 feeding 하지 않을 때 , placeholder 를 사용하면 무조건 에러 발생 !• Reader tensor 로써 dtype 은 필수 속성으로 정의해야함 . shape 과 name 은 optional 속성임

Page 20: 랩탑으로 tensorflow 도전하기 - tutorial

Session 실행

만약 a_data 나 b_data 가 matrix 이라면 output 도 matrix 가 나오겠죠 ?

매번 sess = tf.Session() 을 쓰고 , sess.close() 를 쓰는 게 귀찮다면 ?

Page 21: 랩탑으로 tensorflow 도전하기 - tutorial

c, d 값도 e 와 함께 출력하고 싶다면 ?

Page 22: 랩탑으로 tensorflow 도전하기 - tutorial

Jupyter 사용 시 권장하는 Interactive Session

Session 대비InteractiveSession 의

특징• 명령어 길이가 짧아서 쓰기

간편함• Variable 이 session 을

holding 하는 걸 막을 수 있음( 근데 솔직히 무슨 말인지 잘 모르겠음

… )• 테스트 하다보니 interactive

하게 , 그러니까 중간에 새로 graph 를 정의하고 실행해도 에러가 안남 ( 이게 위에 그 소리인가 싶긴 함… )

• with tf.InteractiveSession as sess(): 는 지원 안함

feed_dict 는 feed_dict=feed_dict 랑 같아요 . 인자가 하나라 전 일케 축약으로 써봤어용 . 원래 이렇게 사용할 수 있어용 !

Page 23: 랩탑으로 tensorflow 도전하기 - tutorial

특정 device 에서 특정 연산 수행하기

그리고 이미 눈치채셨겠지만… python 에선 indentation( 들여쓰기 ) 이 매우 매우 중요합니다 .다른 언어에서 사용하는 {} 대신 : 과 indentation 으로 block 을 구분한다능 !( 가끔 에러가 왜 생겼는지 보다보면 이따금 indentation 으로 인한 에러일 경우도 있으니 , 주의하세용 !)

GPU 를 쓰신다면 “ /cpu:0” 대신 “ /gpu:0” 을 쓰실 수도 있겠죠 ?

Cluster 모드에서 특정 job 을 특정 device 에서 수행하는 내용은 여기 참조

Page 24: 랩탑으로 tensorflow 도전하기 - tutorial

02. MNIST_example

Page 25: 랩탑으로 tensorflow 도전하기 - tutorial

MNIST Data• MNIST 는 computer vision 데이터셋으로 손으로 쓴 0~9 까지의 숫자를 의미함• Tensorflow 는 Yann Lecun 웹사이트에 업로드된 MNIST 데이터를 쉽게 가져올 수

있는 환경을 제공함 ( 혹시 LeCunn 사이트다 다운된 경우 , 링크1 참조하여 다운로드 / 업로드 . 그 외 에러는 링크2 참조 )

• 데이터 구성 : mnist.train(55,000개 ), mnist.test(10,000개 ), mnist.validation(5,000개 )

• 각 데이터는 0부터 9 까지의 image 와 label 로 구성됨 . ex) mnist.train.images, mnist.train.lables

• 이미지는 28 x 28 pixel 인데 이를 NumPy array 로 변환된 상태로 제공됨

Page 26: 랩탑으로 tensorflow 도전하기 - tutorial

MNIST 데이터 가져오기

• one_hot=True: label 을 one-hot vectors 로 표현하겠다는 의미• one-hot vector 는 하나만 1 이고 나머지는 0 인 n개의 class(dimension) 를 표현하는 binary vector

• ex. 3 -> [0,0,0,1,0,0,0,0,0,0]• mnist.train.label 은 float 형식의 [55000, 10] array 임

Page 27: 랩탑으로 tensorflow 도전하기 - tutorial

가져온 MNIST 데이터 확인하기

• flatten 2D array: n x m array 를 nm x 1 array 로 flatten 하게 만듦• flatten 방식만 일관적이면 어떤

방법을 써도 상관없음

Page 28: 랩탑으로 tensorflow 도전하기 - tutorial

모델 파라미터 정의

• image size: 이미지의 크기로 MNIST 이미지의 height, wideth 의 pixel 크기에 해당함• image shape: 이미지의 shape 으로 통상적으로 (img_size_height, img_size_width) 의 2D

array 로 표현함• img_size_flat: 이미지를 flattened 1D array(img_size_height * img_size_width) 로 표현 .

MNIST 의 경우 shape 값은 28*28=784• num_classes: 분류할 class 갯수로 MNIST 의 경우 0-9 이므로 10 임• learning rate: learning 을 얼마나 빨리할지에 대한 비율 정의 . learning_rate 이 너무 낮으면 값이

잘 수렴하지 않고 오랜 시간이 필요하고 , learning_rate 이 너무 크면 값이 발산하거나 이상한 곳에서 수렴할 수 있음

• batch_size: 데이터 중 몇개의 sample 을 쓸 건지 결정• training_iteration: batch size 데이터로 forward + backward 를 수행하는 횟수• display_step: 모든 iteration 을 보여주면 양이 많으니까 iteration 결과를 보여줄 간격을 정의함https://qph.ec.quoracdn.net/main-qimg-f3972c89625c0451f0ea92a4c0ea0728 http://aikorea.org/cs231n/assets/nn3/learningrates.jpeg

Page 29: 랩탑으로 tensorflow 도전하기 - tutorial

Computational graph 정의• Softmax Regression 으로 이미지 분류를 수행하는 간단한 computational

graph 를 정의함• Softmax: 각각의 y(class 로 분류될 확률 ) 는 0~1 사이의 값을 가지면서 그 합이 1

인 함수

Page 30: 랩탑으로 tensorflow 도전하기 - tutorial

Computational graph 정의 (2)• tf.summary 나 tf.name.scope 과 같은 함수는 없어도 무관함 . 다만 이러한 코드를

작성하면 후에 tensorboard 에서 변수의 변화 양상을 볼 수 있음 .• 하기의 cost_function, optimizer 만 정의해도 괜찮음

Page 31: 랩탑으로 tensorflow 도전하기 - tutorial

Session 실행 : training

나중에 tensorboard 실행시 이 directory 활용

전체 데이터수를 한번에 돌릴 데이터 수로 나눠 해당 값만큼 training 을 수행함

Page 32: 랩탑으로 tensorflow 도전하기 - tutorial

Session 실행 : validation• label 결과 (model, predicted y) 는 one-hot vector 이므로 결과 중 가장 큰 값의

label 을 return 하면 분류될 class 가 됨 . 이때 사용하는 함수가 tf.argmax() 임• tf.equl(true_c, y_c): true_c tensor( 진짜 class label) 와 y_c tensor( 예측한

class label) 가 같은지 element-wise 하게 확인하여 결과를 bool 형식 tensor 로 return 함

• tf.reduce_mean(input_tensor): input_tensor 안에 모든 element 값에 대한 평균 산출

• tf.cast(prediction, “float”): prediction 을 float type 으로 변경하여 return 함

Page 33: 랩탑으로 tensorflow 도전하기 - tutorial

Helper function 활용helper function 을 정의해서 활용하면 좋음1. 간단하게 test 데이터에 대한 accuracy 를 출력하는 helper function 을 정의

잠깐 , 데이터를 왜 3 개로 나눌까요 ? 데이터마다 쓰임이 다릅니다 ~Training• 데이터에 잘 맞는 예측 모델을 생성하기 위해 필요Validation• Training 데이터로 만든 모델을 validation 데이터에 검증하여 더 정확한 모델을

만듦 . 가장 잘 맞는 예측 모델 선택함 . • NN 같은 경우는 parameter tuning 을 위해 필요Test• 새로운 데이터에 대해서도 모델이 얼마나 유사한 결과를 낼 수 있는지

(robustness) 검증함 . 단 , 데이터양이 적을 경우 test 는 생략함

Page 34: 랩탑으로 tensorflow 도전하기 - tutorial

Helper function 활용 (2)2. (3 x 3) 형식으로 실제 이미지를 출력하고 , 이미지 하단에 실제 label 과 예측 label 을 표시하는 helper function 정의

Page 35: 랩탑으로 tensorflow 도전하기 - tutorial

Helper function 활용 (3)2. (3 x 3) 형식으로 test 데이터셋의 이미지를 출력하고 , 이미지 하단에 실제 label 과 예측 label 을 표시하는 helper function 정의

Page 36: 랩탑으로 tensorflow 도전하기 - tutorial

( 일반적인 ) Tensorboard 실행 및 종료• 실행 : tensorboard --logdir=/log_path

• 종료 : ctrl-z 를 누르면 종료됨

• 만약 종료되지 않을 경우 , 하기와 같은 방법으로 process 를 죽일 수 있음

Docker 는 다르다는데…아직… 어떻게 해야하는지 못찾았어요 ㅠㅠ

Page 37: 랩탑으로 tensorflow 도전하기 - tutorial

03. Contrib & TF-Slim

Page 38: 랩탑으로 tensorflow 도전하기 - tutorial

Contrib

• TensorFlow 에서는 분석을 쉽게 할 수 있도록 추상화된 수준의 40 여개의 library 를 제공함 . • 다만 공식 지원 영역이 아니기 때문에 공지 없이 해당 내용이 삭제되거나 변경될수 있어 , 이를 기반으로 코드를 짤

경우 유지 보수가 용이하진 않음 . • 그러나 black box 형식으로 간단한 테스트를 빠르게 구현할 때 매우 유용함 . • 또한 , library 들은 최대한 중복 없이 구성되도록 관리되고 있음 .• 예제로 가장 많이 쓰이는 "Quickstart" 코드의 상당수는 contrib 의 learn 라이브러리를 활용하였으나 현재

버전 (version 0.12.1) 으로 업데이트되어 있지 않아 실행 시 상당수의 INFO, WARNING 로그들을 확인할 수 있음 .

Page 39: 랩탑으로 tensorflow 도전하기 - tutorial

TF-Slim• contrib 중 하나의 library 로 , 상위 수준의 개념 (argument scoping, layer, variable) 으로 모델을 짧고

쉽게 정의할 수 있게 만듦• 많이 사용되는 regularizer 를 사용하여 모델을 단순하게 함 . VGG, AlexNet 와 같이 많이 쓰이는 모델을 개발해놓음

Page 40: 랩탑으로 tensorflow 도전하기 - tutorial

Without TF-Slim vs. With TF-Slim• conv1_1 layer 정의 방법 (without TF-Slim)

• conv1_1 layer 정의 방법 (with TF-Slim)

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/slim

Page 41: 랩탑으로 tensorflow 도전하기 - tutorial

Contrib 를 활용한 구현의 장단점1. 장점

• 구현 속도가 무진장 빠름 . 그냥 모델에 대한 파라미터만 적당히 정해주면 알아서 결과가 뿅 나옴

• 모델에 대한 지식이 많이 필요 없음 . 나도 모르게 예제 파일을 따라하다 구글링 몇 번하면 뭔가를 만들 수 있음 .

2. 단점• TF 버전 업과 함께 bug 가 우수수수… .떨어짐… 버전 초기에는 구글링해도 잘 못 잡음 • 막상 해보면 내 입맞에 딱 맞도록 모델 customize 하기는 한계가 있음 . 그리고 새로

뜨는 모델을 쓰려면 해당 모델이 추가될 때까지 기다려야 함• 끝까지 모델에 대해 대충 알고 넘어감… . 그래서 잘 모르는데 누가 자세히 물어볼까봐

두려움에 시달림 ㅠ 그러나 마약과도 같은 존재라 빠져들면 귀찮아서 그냥 여기에 젖어들고 싶음 .. 그런데 파일럿하고 자꾸 새로운 걸 해야해서 하다보면 결국 여길 벗어나야함 .

따라서 , Contrib 는 TF 입문용으로 활용하는 게 제일 좋음

Page 42: 랩탑으로 tensorflow 도전하기 - tutorial

Page 43: 랩탑으로 tensorflow 도전하기 - tutorial

Computation Graph특정 순서로 수행될 a series of math operations 을 의미한다 . 연산(computation) 을 그래프로 그린 것이라고 생각하면 가장 간단 !예로 , 하기의 그래프는 2개의 input 인 a, b 를 받아 output 으로 e 를 내보냄 . 그래프 내의 각 node 는 input 을 받아 computation 을 수행하고 output 을 다른 node 에 전달하는 operation 을 수행함 .

( 이건 뒤에 설명하겠음 )

그렇담 이 Node(operation) 들의 입력과 출력을 뭐라고 부를까 ?

[ 별첨 ]

Page 44: 랩탑으로 tensorflow 도전하기 - tutorial

TensorTensor 는 데이터 (n-dimensional array 나 list) 를 의미하며 그림의 a,b,c,d,e의 input 과 output 이 이에 해당함 . 또한 , Tensor 는 rank, shape, type 과 같은 속성을 가짐 .- rank: tensor 의 dimension 의 수 - shape: 각 dimension 의 크기를 의미- data type(dtype): int8, int16, int32, int64, float32, float64, bool,

string 등등예제 :[[1, 2, 3], [4, 5, 6], [7, 8, 9], [2, 3, 4]] 의 rank, shape, dtype 은 ?

rank: 2 / shape: [4, 3] / dtype: int32

퀴즈 :[[[1, 2], [3, 4]], [[5, 6], [7, 8]]] 의 rank, shape, dtype 은 ?

rank: 3 / shape: [2, 2, 2] / dtype: int32

[ 별첨 ]

Page 45: 랩탑으로 tensorflow 도전하기 - tutorial

실수로 docker 로 ctrl-c 로 종료하였을 때 복구 방법[ 별첨 ]

docker ps -a 로 종료된 이미지 확인 : CONTAINER_ID 복사

• docker start CONTAINER_ID 로 docker 재시작( 만약 떠 있는 docker process 가 있어서 재시작이 안 되면 , docker stop CONTAINER ID 로 종료시킴 )• docker exec -it CONTAINER_ID /bin/bash 로 docker 실행 후

localhost:8888 접속