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이므로!
6
Jupyter: interactive하게 python을실행해볼 수 있는 좋은 web UI 제공
Jupyter에서 만든 notebook(jupyter의 파일 기본 단위)의 확장자
각종 파일 및 이미지를 올릴 수 있음
새로운 파일 및 폴더 생성 가
능.
python 노트북과 터미널을
제일 많이 쓰게 됨
현재 사용 중인 노트북 상태
(구 iPython)
7.
7
Running 되고 있는notebook이 너무 많으면 속도를 위해 shutdown 시켜줄 필요가 있음
터미널은 ‘exit’ 없이 창만 닫을 경우 계속 running 상태임. shutdown 클릭을 통해 손쉽게 종료 가능
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
가장 먼저 computationalgraph 정의와 실행의 분리 이해!
• a = a + 1인 그래프를 정의하여, 1,2,3 값을 출력하기lazy computing
잊지마세요. session.run()이 되어야 비로소 꽃이 될 수 있음을!
a=0
a=a+1
a=a+1로
업데이트하는
그래프를
3번 반복하기
shift + Enter 결과 보기
12.
12
가장 먼저 computationalgraph 정의와 실행의 분리 이해!
• 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()임
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()를 쓰는 게 귀찮다면?
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에서 수행하는 내용은 여기 참조
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만 정의해도 괜찮음
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 활용
helperfunction을 정의해서 활용하면 좋음
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는 다르다는데…아직… 어떻게 해야하는지 못찾았어요 ㅠㅠ
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 입문용으로 활용하는 게 제일 좋음
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 접
속