Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

랩탑으로 tensorflow 도전하기 - tutorial

7,067 views

Published on

사내 스터디용으로 공부하며 만든 발표 자료입니다. 부족한 부분이 있을 수도 있으니 알려주시면 정정하도록 하겠습니다.

Published in: Data & Analytics
  • Be the first to comment

랩탑으로 tensorflow 도전하기 - tutorial

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

×