4. 1. Tensorflow란?
“TensorFlow is an open source software library
for numerical computation using data flow graphs”
TensorFlow는 data flow graphs를 사용하여 수치 계산을 위한 오픈 소
스 소프트웨어 라이브러리이다.
5. (일부 데이터 분석 프로그램을 작성할 때에도 자바로 구동할 때 느려서 C나 C++로 동일한
부분을 짜서, 서비스로 구현하는 경우도 종종 있는데 심지어 자바보다도 느린 파이썬으로 딥
러닝을 구동하는 것 자체가 에바참치다.)
1. Tensorflow란?
1.1 Tensorflow 정의
텐서플로우는 구글(Google)에서 만든, 딥러닝 오픈소스 패키지이다.
실제 파이썬 개발자들도 텐서플로우를 이해하기 상당히 힘들다.
텐서플로우는 정확하게 말하자면 파이썬에서 돌아가는 것이 아니라 파이썬으로 텐
서플로우를 구동한다고 이해하면 된다.
애시당초 파이썬은 자바보다도 느린 언어라서 파이썬의 함수를 이용해서 딥러닝같
은 엄청난 자원을 쓰는 알고리즘을 돌리는 것은 바보같은 짓이다.
7. 1. Tensorflow란?
1.2 Tensorflow 특징
• 그래프의 노드(Node)는 수치 연산을 나타내고 엣지(edge)는 노드 사이를 이동
하는 다차원 데이터 배열(텐서) + 배열의 이동(플로우)
• 데이터 플로우 그래프를 통한 풍부한 표현력
• 코드 수정 없이 CPU/GPU 모드로 동작
• 아이디어 테스트에서 서비스 단계까지 이용 가능
• 계산 구조와 목표 함수만 정의하면 자동으로 미분 계산을 처리
• Python/C++를 지원하며, SWIG를 통해 다양한 언어 지원 가능
8. 1.3 왜 이름이 Tensorflow 일까?
텐서플로우라는 뜻은 직역하면 텐서의 흐름(Tensor - flow),
즉 데이터의 흐름(Data-flow)과 동일하다. 즉 텐서플로우는 데이터의 흐름을 위해
서 만들어진 라이브러리라고 생각하면 된다.
우리 뇌에는 수많은 뉴런들이 있고 데이터를 이 뉴런들을 통해서 전달하게 되는데
이 뉴런들을 그래프라고 인식하면 되고 뉴런들안에 있는 데이터가 텐서라고 생각
하면 된다.
1. Tensorflow란?
9. 용어 설명
오퍼레이션(Operation) 그래프 상의 노드는 오퍼레이션(줄임말 op)으로 불립니다.
오퍼레이션은 하나 이상의 텐서를 받을 수 있습니다. 오퍼레이션은 계산
을 수행하고, 결과를 하나 이상의 텐서로 반환할 수 있습니다.
텐서(Tensor) 내부적으로 모든 데이터는 텐서를 통해 표현됩니다. 텐서는 일종의 다차
원 배열인데, 그래프 내의 오퍼레이션 간에는 텐서만이 전달됩니다
세션(Session) 그래프를 실행하기 위해서는 세션 객체가 필요합니다. 세션은 오퍼레이
션의 실행 환경을 캡슐화한 것입니다.
변수(Variables) 변수는 그래프의 실행시, 패러미터를 저장하고 갱신하는데 사용됩니다.
메모리 상에서 텐서를 저장하는 버퍼 역할을 합니다.
1.4 기본 용어
Tensor : “학습 데이터가 저장되는 다차원 배열 ”
1. Tensorflow란?
12. 텐서플로우는 Stream Programming의 일종이
다. Flow graph 형태로 구조화하고, 각 노드는
엣지를 따라 데이터를 받게되고 처리하여 출력
한다.
우리 유저들은 이런 flow graph를 모르더라도
TensorBoard라는 자동으로 그려주는 모듈 덕
분에 편히 사용할 수 있다.
1. Tensorflow란?
14. 2. TensorFlow 기본
print(변수) 명을 적었지만 예상했던 "1"이라는 값이 출력되지 않고 a라는 변수의
상태가 적혀 있다. a라는 변수는 string이라는 자료형으로 담겨져 있고, 상수를 담고
있다는 의미이다.
2.1 Tensorflow 설치
15. 텐서플로우는 뉴럴네트워크에 최적화되어 있는 개발 프레임웍이기 때문에, 그 자
료형과, 실행 방식이 약간 일반적인 프로그래밍 방식과 상의하다.
상수형은 말 그대로 상수를 저장하는 데이타 형이다.
tf.constant(value, dtype=None, shape=None, name='Const',
verify_shape=False)
와 같은 형태로 정의 된다.
각 정의되는 내용은 아래와 같다.
속성 설명
value 상수의 값이다.
dtype 상수의 데이타형이다. tf.float32와 같이 실수,정수등의 데이타 타입을 정
의한다.
shape 행렬의 차원을 정의한다. shape=[3,3]으로 정의해주면, 이 상수는 3x3 행
렬을 저장하게 된다.
name name은 이 상수의 이름을 정의한다.
2.2 상수 자료형
2. TensorFlow 기본
16. 예제 (1)
import tensorflow as tf
a = tf.constant([5],dtype=tf.float32)
b = tf.constant([10],dtype=tf.float32)
c = tf.constant([2],dtype=tf.float32)
d = a*b+c
print(d)
2. TensorFlow 기본
17. 그런데, 막상 실행해보면, a*b+c의 값이 아니라 다음과 같이 Tensor… 라는 문자
열이 출력된다.
Tensor("add_3:0", shape=(1,), dtype=float32)
2. TensorFlow 기본
18. 그래프와 세션이라는 개념을 이해해야 텐서플로우의 프로그래밍 모델을 이해할 수
있다.
텐서플로우는 기본적으로 그래프라는 것을 기반으로 작동을 하게 된다.
일반 사람들은 그래프라고 하면 수치를 바 형태로 표현하는 것을 이해할 수 있지만
여기서 말하는 그래프는 쉽게 생각해서 신경망 모양을 이해하면 될 것이다.
2. TensorFlow 기본
2.3 그래프
19. 예제 (2)
import tensorflow as tf
a = tf.constant([5],dtype=tf.float32)
b = tf.constant([10],dtype=tf.float32)
c = tf.constant([2],dtype=tf.float32)
d = a*b+c
sess = tf.Session()
result = sess.run(d)
print(result)
2. TensorFlow 기본
20. 위의 d=a*b+c 에서 d 역시 계산을 수행하는 것이 아니라 위와 같이 a*b+c 그래
프를 정의하는 것이다.
실제로 값을 뽑아내려면, 이 정의된 그래프에 a,b,c 값을 넣어서 실행해야 하는데,
세션 (Session)을 생성하여, 그래프를 실행해야 한다. 세션은 그래프를 인자로
받아서 실행을 해주는 일종의 러너(Runner)라고 생각하면 된다.
2. TensorFlow 기본
21. 텐서플로우 프로그램을 시각화 한 것이 위의 모양이라고 생각하면 된다.
우선 X와 Y의 값을 생성하고, 이 텐서들을 add라는 명령어로 값을 합친 후,
sess.run이라는 텐서의 실행으로 값을 실행하면 15라는 값이 나오게 된다.
기존의 프로그램과 차이점이 이해가 안될 수 있지만, sess.run이라는 것을 수행하기
전에는 위의 내용은 실행이 되지 않는다. 즉, 미리 세팅해놓고 sess.run을 통해서 실
제 프로그램을 작동하는 것이 텐서플로우 방식이다.
2. TensorFlow 기본
22. 추가가 된 것은 session 이라는 것을 실행한다는
것과, 마지막에는 세션을 종료한 부분을 넣었다.
텐서플로우는 이렇게 내용의 와꾸(?)를 짜놓고, 마
지막에 스위치 버튼을 눌러서 실행을 하는 구조이
고 이것을 지연실행이라고 한다.
2. TensorFlow 기본
23. 텐서플로우(tensorflow)에는 플레이스홀더(Placeholder)라는 기능이 있습니다.
텐서플로우는 그래프라는 것을 미리 만들어 놓고, 필요한 시점에 해당 그래프를 실
행하는 지연실행(lazy evaluation)이라는 방식을 사용합니다.
이런 내용에 걸맞게 플레이스홀더는 변수의 타입을 미리 설정해놓고 필요한 변수
를 나중에 받아서 실행하는 것을 의미합니다.
텐서플로우는 신경망을 구현하기 때문에 신경망과 가장 어울리는 변수 설정이 바
로 플레이스 홀더 입니다.
2. TensorFlow 기본
2.4 플레이스홀더
24. 우리가 신경망을 구현하기 위해서는 우선 Input 노드와 Output 노드를 설계합니다.
Input 노드는 Feature들이겠고, Output 노드는 연산이 되어서 최종적으로 나온 결과
값이겠지요. 그리고 중간에 Hidden 노드를 생성하고 튜닝해서 Output 노드를 최적화
합니다
즉 데이터셋과 모델셋을 분리를 하게 되어서, 필요한 데이터셋을 모델에 대입을 하게
되면 신경망을 구축하기 상당히 수월해 집니다. 이 개념을 한번 코딩으로 구현해보도
록 하겠습니다.
2. TensorFlow 기본
25. y = x * 2 를 그래프를 통해서 실행한다고 하자. 입력값으로는 1,2,3,4,5를 넣고, 출
력은 2,4,6,8,10을 기대한다고 하자. 이렇게 여러 입력값을 그래프에서 넣는 경우
는 머신러닝에서 y=W*x + b 와 같은 그래프가 있다고 할 때, x는 학습을 위한 데
이타가 된다.
즉 지금 살펴보고자 하는 데이타 타입은 학습을 위한 학습용 데이타를 위한 데이타
타입이다.
y=x*2를 정의하면 내부적으로 다음과 같은 그래프가 된다.
이렇게 학습용 데이타를 담는 그릇을 플레이스홀더(placeholder)라고 한다.
2. TensorFlow 기본
26. 플레이스 홀더는 그래프에서 x 즉 입력값을 저장하는 일종의 통(버킷)이다.
tf.placeholder(dtype,shape,name)
으로 정의된다.
속성 설명
dtype 플레이스홀더에 저장되는 데이타형이다. tf.float32와 같이 실수,정수등의
데이타 타입을 정의한다
shape 행렬의 차원을 정의한다. shapre=[3,3]으로 정의해주면, 이 플레이스홀
더는 3x3 행렬을 저장하게 된다.
name name은 이 플레이스 홀더의 이름을 정의한다.
그러면 이 x에 학습용 데이타를 어떻게 넣을 것인가? 이를 피딩(feeding)이라고
한다.
2. TensorFlow 기본
27. 예제 (3)
import tensorflow as tf
input_data = [1,2,3,4,5]
x = tf.placeholder(dtype=tf.float32)
y = x * 2
sess = tf.Session()
result = sess.run(y,feed_dict={x:input_data})
print result
2. TensorFlow 기본
29. 예제 (3)
import tensorflow as tf
input_data = [1,2,3,4,5]
x = tf.placeholder(dtype=tf.float32)
y = x * 2 # 그래프생성
sess = tf.Session()
result = sess.run(y,feed_dict={x:input_data})
print result
1, 2, 3, 4, 5
Input_data
2. TensorFlow 기본
30. 예제 (3)
import tensorflow as tf
input_data = [1,2,3,4,5]
x = tf.placeholder(dtype=tf.float32)
y = x * 2 # 그래프생성
sess = tf.Session()
result = sess.run(y,feed_dict={x:input_data})
print result
1, 2, 3, 4, 5
Input_data
x
dtype=tf.float32
플레이스 홀더
2. TensorFlow 기본
31. 예제 (3)
import tensorflow as tf
input_data = [1,2,3,4,5]
x = tf.placeholder(dtype=tf.float32)
y = x * 2 # 그래프생성
sess = tf.Session()
result = sess.run(y,feed_dict={x:input_data})
print result
Y = x*2
x *
2
1, 2, 3, 4, 5
Input_data
x
dtype=tf.float32
그래프
플레이스 홀더
2. TensorFlow 기본
32. 예제 (3)
import tensorflow as tf
input_data = [1,2,3,4,5]
x = tf.placeholder(dtype=tf.float32)
y = x * 2 # 그래프생성
sess = tf.Session()
result = sess.run(y,feed_dict={x:input_data})
print result
Y = x*2
x *
2
1, 2, 3, 4, 5
Input_data
x
dtype=tf.float32
피딩
[ 2. 4. 6. 8. 10.]
그래프
플레이스 홀더
2. TensorFlow 기본
33. y=W*x+b 라는 학습용 가설이 있을때, x가 입력데이타 였다면, W와 b는 학습을
통해서 구해야 하는 값이 된다. 이를 변수(Variable)이라고 하는데, 변수형은
Variable 형의 객체로 생성이 된다.
예제 (4)
import tensorflow as tf
input_data = [1,2,3,4,5]
x = tf.placeholder(dtype=tf.float32)
W = tf.Variable(2,dtype=tf.float32)
y = W*x
sess = tf.Session()
result = sess.run(y,feed_dict={x:input_data})
print(result)
2. TensorFlow 기본
2.5 변수
34. 예제 (4)
import tensorflow as tf
input_data = [1,2,3,4,5]
x = tf.placeholder(dtype=tf.float32)
W = tf.Variable(2,dtype=tf.float32)
y = W*x
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
result = sess.run(y,feed_dict={x:input_data})
print(result)
텐서플로우에서 변수형은 그래프를 실행하기 전에 초기화를 해줘야 그 값이 변수에
지정이 된다.
2. TensorFlow 기본
35. 텐서플로우를 처음 시작할때, “데이타를 가지고 학습을 시켜서 적정한 값을 찾는
다" 라는 머신러닝 학습 모델의 특성상, 모델을 그래프로 정의하고, 세션을 만들
어서 그래프를 실행하고, 세션이 실행될때 그래프에 동적으로 값을 넣어가면서
(피딩) 실행한 다는 기본 개념을 잘 이해해야 텐서플로우 프로그래밍을 제대로 시
작할 수 있다.
2. TensorFlow 기본
37. 3. TensorFlow 실습
3.1 regression
직역하면 회귀. 그래프상에 무작위하게 흩어져 있는 데이터의 경향을 찾아
선으로 나타내는 것.
선이 직선형태일 경우 linear regression이라고 하며 여기서는 prediction의
한 방법을 뜻함.
38. 위와 같은 표가 주어졌을 때, x가 4이면 y값은 몇일까?
-> 인간은 직관적으로 4라고 추정가능
-> 사실은 머릿속에서 y=x라는 선을 만들어 낸 것
이러한 직관을 컴퓨터에 주입해 기계적인 방식으로 regression이 가능하
게끔 할 수 없을까
3. TensorFlow 실습
39. 주어진 데이터를 표현하는 여러 가설(Hypothesis)이 존재함(각 직선)
직선이므로 H(x)=Wx+b 로 표현가능
W는 weight, b는 bias를 뜻함
여러 가설 중에 가장 잘 들어맞는 것을 찾자
3. TensorFlow 실습
40. '가장 잘 들어맞는'의 정의는?
각 데이터와 가설간의 y값 차이를 구해서 평균을 내자
즉, H(x)-y가 y차이에 해당함
하지만 이는 +도 되고 -도 되므로 이를 보완하기 위해 제곱을 때림
제곱을 때림으로서 부호문제도 해결하고 더 큰 차이를 boosting하는 효과도 있음
Q1)
그냥 절댓값을 씌우면 안되나요? -> 절대값을 씌우면 함수가 연속적이지 않음 -> 미분을 할
수 없다
Q2)
-> 왜 미분을 할 수 있어야 하나요? -> 밑에 나온다
3. TensorFlow 실습
41. 따라서 수식은 위와 같으며 이를 cost function 또는 loss function이라고도 함.
cost가 0이라는 뜻은 가설과 데이터가 정확하게 일치한다는 뜻.
cost 함수에 들어가는 인자는 W와 b
이를 미세하게 조정해가며 0에 가까워지는 점을 찾아야 함
3. TensorFlow 실습
3.2 cost function
42. ** 0에 가까워 지는 점을 어떻게 찾는가?
일단 b는 없고 H(x)=Wx 라고 가정
cost함수를 'W'에 대해 미분한 값 -> 기울기에 해당
원래 W에서 기울기를 빼줌
W에 따른 cost가 왼쪽 그림과 같이 나타날 때
W를 -1로 설정한 경우
-> cost=20 이 되고 오른쪽으로 나아가야 함
W가 -1일 때의 기울기는 음수가 나옴
아까 W에서 기울기를 빼준다고 했는데
기울기가 음수이므로 W에서 기울기를 빼면 결국 '오른
쪽으로 가는 셈'
한편 W가 1이라고 가정하면 양수의 기울기가 나옴
W에서 기울기를 빼주면 결국 '왼쪽으로 가는 셈'
또한 W에 따라 cost가 변하므로 'W'에 대해 미분해야
함은 자명
3. TensorFlow 실습
43. 일반적으로 cost함수에 1/2을 곱해줘서, 미분
했을 때 값이 깔끔하게 정리되게 함
어차피 상수를 곱해주는 건 별 의미없음
위에서 마지막 식이 GD 식에 해당함.
:= 는 대입한다는 뜻
저기서 α는 얼마만큼의 강도로 이동할 지를 결정
짓는
계수에 해당
learning rate라 함
α가 너무 크면 지나치게 많이 이동하므로 W가 0
에 수렴하지 않고 발산하게 됨
보통 0.1을 기본으로 잡고 점점 줄여나감
3. TensorFlow 실습
44. y가 단일 x에 대한 1차식으로 나타나는 경우 linear regression이 먹힌다.
예를 들면 pc방 사용시간(x)에 따른 pc방 요금(y)
그러나 현실의 데이터 상관관계는 이렇게 단순하지만은 않다.
x1, x2, x3,.. 가 모여서 y가 결정되는 경우 (Multiple linear regression)
또는 x와 y의 관계가 n차 식으로 나타나는 경우(Nonlinear regression)
이외에도 regression의 종류는 많다.
따라서 linear regression은 그냥 방법중에 하나일뿐이며 모든 데이터 모델에
적용가능한 것은 아니다.
3. TensorFlow 실습