본문 바로가기
정보공유

랩탑으로 tensorflow 도전하기 - tutorial

by 날고싶은커피향 2018. 11. 14.

랩탑으로 tensorflow 도전하기 - tutorial




랩탑으로 tensorflow 도전하기 - tutorial
1. TensorFlow hands-on 세션 2017.02.14 이승은
2. 2 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 안됨!
3. 3 Hands-on은 설명을 듣는 것보다는 손으로 직접 짜보는 게 훨씬 훨씬 중요합니다. 그래서 이번 시간에는 설명을 최소화하여 직접 손으로 해보고 Q&A를 진행하도록 하겠습니다. (여기 있는 코드는 이미지라 붙여넣기 어차피 안됩니당…꼭 직접 해보세용!!)
4. 4 TensorFlow를 잘 활용하기 위해서는 Python에 대한 이해와 Python과 연관된 Jupyter, NumPy와 같은 툴에 대한 이해도 필요합 니다. (그러나 Python이나 NumPy는 양이 너무 많아서… 설명보단 코딩을 하며 서서히 익히는 걸로….) 물론 C++ API가 제공되고 있고, 추후 Go와 Java가 제공 예정이지만… 가장 많이 쓰는 건 역시 Python이므로!
5. 5 00. Jupyter
6. 6 Jupyter: interactive하게 python을 실행해볼 수 있는 좋은 web UI 제공 Jupyter에서 만든 notebook(jupyter의 파일 기본 단위)의 확장자 각종 파일 및 이미지를 올릴 수 있음 새로운 파일 및 폴더 생성 가 능. python 노트북과 터미널을 제일 많이 쓰게 됨 현재 사용 중인 노트북 상태 (구 iPython)
7. 7 Running 되고 있는 notebook이 너무 많으면 속도를 위해 shutdown 시켜줄 필요가 있음 터미널은 ‘exit’ 없이 창만 닫을 경우 계속 running 상태임. shutdown 클릭을 통해 손쉽게 종료 가능
8. 8 Markdown으로 코드 사이사이 문장이나 그래프를 사용할 수 있음 Code를 적고 실행하면 바로 결과가 나옴 자주 사용하는 기능들이니 한번씩 눌러서 기능을 확인해 보세요
9. 9 01. Basic
10. 10 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에서 보기 위한 명령어
11. 11 가장 먼저 computational graph 정의와 실행의 분리 이해! • a = a + 1인 그래프를 정의하여, 1,2,3 값을 출력하기lazy computing 잊지마세요. session.run()이 되어야 비로소 꽃이 될 수 있음을! a=0 a=a+1 a=a+1로 업데이트하는 그래프를 3번 반복하기 shift + Enter 결과 보기
12. 12 가장 먼저 computational graph 정의와 실행의 분리 이해! • a = a + 1인 그래프를 정의하여, 1,2,3 값을 출력하기 놀라셨죠…? 이렇게 나와서…
13. 13 Variable를 쓴다면 반드시 해야하는 초기화 (initialization) • 다른 operation이 수행되기 전에 명시적 초기화(explicit initialization)가 필수 적임 • 모든 variable들을 초기화시키는 명령어 활용 sess 선언 바로 뒤에 sess.run(tf.global_variables_initializer()) 추가
14. 14 Variable를 쓴다면 반드시 해야하는 초기화 (initialization) • 다른 operation이 수행되기 전에 명시적 초기화(explicit initialization)가 필수 적임 • 모든 variable들을 초기화시키는 명령어 활용 잉? 어째서…?
15. 15 Variable은 동시에 읽고 쓰기가 가능하다! 만약 동시적인 읽기/쓰기를 막기(lock 만들기) 위해서는 assign을 활용하 자 혹시 여기서 궁금하신 거 없나요? 예를 들면, sess.run(update)와 sess.run(a)의 차이가 무엇인지?
16. 16 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이 수 행됨
17. 17 print(a) vs. print(sess.run(a)) vs. print(a.eval()) • print(a)는 a라는 tensor에 대한 정보(rank, shape, dtype)를 제공함 • 따라서 값을 fetch하기 위해서는 sess.run(a)를 출력해야하고 이에 대한 축약 버 전이 a.eval()임
18. 18 이제 이 그림을 tensorflow로 표현해봅시다
19. 19 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 속성임
20. 20 Session 실행 만약 a_data나 b_data가 matrix이라면 output도 matrix가 나오겠죠? 매번 sess = tf.Session()을 쓰고, sess.close()를 쓰는 게 귀찮다면?
21. 21 c, d 값도 e와 함께 출력하고 싶다면?
22. 22 Jupyter 사용 시 권장하는 Interactive Session Session 대비 InteractiveSession의 특징 • 명령어 길이가 짧아서 쓰기 간 편함 • Variable이 session을 holding 하는 걸 막을 수 있음 (근데 솔직히 무슨 말인지 잘 모르겠음 …) • 테스트 하다보니 interactive하 게, 그러니까 중간에 새로 graph를 정의하고 실행해도 에러가 안남 (이게 위에 그 소리인가 싶긴 함…) • with tf.InteractiveSession as sess(): 는 지원 안함 feed_dict는 feed_dict=feed_dict 랑 같아요. 인자가 하나라 전 일케 축약으로 써봤어용. 원래 이렇게 사용할 수 있어용!
23. 23 특정 device에서 특정 연산 수행하기 그리고 이미 눈치채셨겠지만… python에선 indentation(들여쓰기)이 매우 매우 중요합니다. 다른 언어에서 사용하는 {} 대신 :과 indentation으로 block을 구분한다능! (가끔 에러가 왜 생겼는지 보다보면 이따금 indentation으로 인한 에러일 경우도 있으니, 주의하세용!) GPU를 쓰신다면 “/cpu:0”대신 “/gpu:0”을 쓰실 수도 있겠죠? Cluster 모드에서 특정 job을 특정 device에서 수행하는 내용은 여기 참조
24. 24 02. MNIST_example
25. 25 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로 변환된 상태로 제공됨
26. 26 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임
27. 27 가져온 MNIST 데이터 확인하기 • flatten 2D array: n x m array를 nm x 1 array로 flatten하게 만듦 • flatten 방식만 일관적이면 어떤 방법 을 써도 상관없음
28. 28 모델 파라미터 정의 • 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
29. 29 Computational graph 정의 • Softmax Regression으로 이미지 분류를 수행하는 간단한 computational graph를 정 의함 • Softmax: 각각의 y(class로 분류될 확률)는 0~1 사이의 값을 가지면서 그 합이 1인 함수
30. 30 Computational graph 정의 (2) • tf.summary나 tf.name.scope과 같은 함수는 없어도 무관함. 다만 이러한 코드를 작성하 면 후에 tensorboard에서 변수의 변화 양상을 볼 수 있음. • 하기의 cost_function, optimizer만 정의해도 괜찮음
31. 31 Session 실행: training 나중에 tensorboard 실행시 이 directory 활용 전체 데이터수를 한번에 돌릴 데이터 수로 나눠 해당 값만큼 training을 수행함
32. 32 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함
33. 33 Helper function 활용 helper function을 정의해서 활용하면 좋음 1. 간단하게 test 데이터에 대한 accuracy를 출력하는 helper function을 정의 잠깐, 데이터를 왜 3개로 나눌까요? 데이터마다 쓰임이 다릅니다~ Training • 데이터에 잘 맞는 예측 모델을 생성하기 위해 필요 Validation • Training 데이터로 만든 모델을 validation 데이터에 검증하여 더 정확한 모델 을 만듦. 가장 잘 맞는 예측 모델 선택함. • NN 같은 경우는 parameter tuning을 위해 필요 Test • 새로운 데이터에 대해서도 모델이 얼마나 유사한 결과를 낼 수 있는지 (robustness) 검증함. 단, 데이터양이 적을 경우 test는 생략함
34. 34 Helper function 활용 (2) 2. (3 x 3) 형식으로 실제 이미지를 출력하고, 이미지 하단에 실제 label과 예측 label을 표 시하는 helper function 정의
35. 35 Helper function 활용 (3) 2. (3 x 3) 형식으로 test 데이터셋의 이미지를 출력하고, 이미지 하단에 실제 label과 예측 label을 표시하는 helper function 정의
36. 36 (일반적인) Tensorboard 실행 및 종료 • 실행: tensorboard --logdir=/log_path • 종료: ctrl-z 를 누르면 종료됨 • 만약 종료되지 않을 경우, 하기와 같은 방법으로 process를 죽일 수 있음 Docker는 다르다는데…아직… 어떻게 해야하는지 못찾았어요 ㅠㅠ
37. 37 03. Contrib & TF-Slim
38. 38 Contrib • TensorFlow에서는 분석을 쉽게 할 수 있도록 추상화된 수준의 40여개의 library를 제공함. • 다만 공식 지원 영역이 아니기 때문에 공지 없이 해당 내용이 삭제되거나 변경될수 있어, 이를 기반으로 코 드를 짤 경우 유지 보수가 용이하진 않음. • 그러나 black box 형식으로 간단한 테스트를 빠르게 구현할 때 매우 유용함. • 또한, library들은 최대한 중복 없이 구성되도록 관리되고 있음. • 예제로 가장 많이 쓰이는 "Quickstart" 코드의 상당수는 contrib의 learn 라이브러리를 활용하였으나 현재 버전(version 0.12.1)으로 업데이트되어 있지 않아 실행 시 상당수의 INFO, WARNING 로그들을 확인할 수 있음.
39. 39 TF-Slim • contrib 중 하나의 library로, 상위 수준의 개념(argument scoping, layer, variable)으로 모델을 짧고 쉽게 정 의할 수 있게 만듦 • 많이 사용되는 regularizer를 사용하여 모델을 단순하게 함. VGG, AlexNet와 같이 많이 쓰이는 모델을 개발 해놓음
40. 40 Without TF-Slim vs. With TF-Slim • conv1_1 layer 정의 방법 (without TF-Slim) • conv1_1 layer 정의 방법 (with TF-Slim) b.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/slim
41. 41 Contrib를 활용한 구현의 장단점 1. 장점 • 구현 속도가 무진장 빠름. 그냥 모델에 대한 파라미터만 적당히 정해주면 알아서 결 과가 뿅 나옴 • 모델에 대한 지식이 많이 필요 없음. 나도 모르게 예제 파일을 따라하다 구글링 몇 번하면 뭔가를 만들 수 있음. 2. 단점 • TF 버전 업과 함께 bug가 우수수수….떨어짐… 버전 초기에는 구글링해도 잘 못 잡 음 • 막상 해보면 내 입맞에 딱 맞도록 모델 customize하기는 한계가 있음. 그리고 새로 뜨는 모델을 쓰려면 해당 모델이 추가될 때까지 기다려야 함 • 끝까지 모델에 대해 대충 알고 넘어감….그래서 잘 모르는데 누가 자세히 물어볼까 봐 두려움에 시달림 ㅠ 그러나 마약과도 같은 존재라 빠져들면 귀찮아서 그냥 여기 에 젖어들고 싶음.. 그런데 파일럿하고 자꾸 새로운 걸 해야해서 하다보면 결국 여 길 벗어나야함. 따라서, Contrib는 TF 입문용으로 활용하는 게 제일 좋음
42. 42 끝
43. 43 Computation Graph 특정 순서로 수행될 a series of math operations을 의미한다. 연산(computation)을 그 래프로 그린 것이라고 생각하면 가장 간단! 예로, 하기의 그래프는 2개의 input인 a, b를 받아 output으로 e를 내보냄. 그래프 내의 각 node는 input을 받아 computation을 수행하고 output을 다른 node에 전달하는 operation을 수행함. (이건 뒤에 설명하겠음) 그렇담 이 Node(operation)들의 입력과 출력을 뭐라고 부를까? [별첨]
44. 44 Tensor Tensor는 데이터(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 [별첨]
45. 45 실수로 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 접 속


반응형