레이블이 AI인 게시물을 표시합니다. 모든 게시물 표시
레이블이 AI인 게시물을 표시합니다. 모든 게시물 표시

2017년 11월 17일 금요일

텐서플로 시작하기(Getting Started With TensorFlow)(2)



출처 : https://www.tensorflow.org/get_started/get_started

이글은 영어 원본을 읽고 공부하면서 불필요한 내용 빼고 이해하기 쉽도록 적절히 내맘대로 작성해보았습니다. 이해가 잘못되어 원저자의 의도대로 번역이 안되어 있을 수도 있습니다. 이점 참고해서 읽어 주시면 고맙겠습니다


앞서 작성한 글


이 글은 앞서 작성한 글에 이어지는 글입니다.



모델을 학습 가능하게 만들려면 Variable를 사용하여 그래프에 학습 가능한 매개 변수를 추가 할 수 있습니다.
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b
여기에서 정리
tf.placeholder() : runtime 중에 데이터를 변경하기 위해서 사용
tf.constant() : 상수 텐서 생성
tf.Variable() : 변수 텐서 생성

tf.constant() 상수들은 tf.constant() 호출할때 초기화 되어지고, 그 값은 절대 변하지 않습니다. 반면에 tf.Variable() 변수들은 tf.Variable() 호출할때 초기화 되지않습니다. 초기화 하려면 다음과 같은 특별한 함수를 호출 해야 합니다. tf.global_variables_initializer()
init = tf.global_variables_initializer()
sess.run(init)
init(위 예제에서 init은 graph 핸들)이 모든 전역 변수를 초기화하는 TensorFlow 하위 그래프의 핸들임을 인식하는 것이 중요합니다. sess.run을 호출 할 때까지 변수는 초기화되지 않습니다.

x는 placeholder이기 때문에 몇개의 x값을 위한 linear_model을 동시에 다음과 같이 평가할 수 있습니다.
print(sess.run(linear_model, {x: [1, 2, 3, 4]}))
그러면 결과가 다음과 같이 나옵니다.
[ 0.          0.30000001  0.60000002  0.90000004]
원본에는 없지만 전체 예제는 다음과 같고 그래프도 그려보겠습니다.

전체 예제
import tensorflow as tf

sess = tf.Session()
file_writer = tf.summary.FileWriter('E:/work/ai/anaconda', sess.graph)

W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b

init = tf.global_variables_initializer()
sess.run(init)

print(sess.run(linear_model, {x: [1, 2, 3, 4]}))

file_writer.add_graph(sess.graph)
file_writer.close()




앞에서 (linear_model = W*x + b) 모델을 만들었지만 아직 얼마나 좋은지 모릅니다. 교육 데이터에 대한 모델을 평가하려면 원하는 값을 제공하기 위해 y placeholder가 필요하며 또한 손실 함수도 만들어야합니다.
손실 함수는 제공된 모델로부터 현재 모델이 얼마나 떨어져 있는지를 측정합니다. (손실함수를 오차 함수로 표현하기도합니다)
현재 모델과 제공된 데이터 사이의 델타 제곱을 합한 선형 회귀 분석에 표준 손실 모델을 사용합니다. (델타 제곱을 사용하는 이유는 오차(기준값과의 차이)가 (-)마이너스가 나온는 경우가 있기 때문에 제곱을 사용합니다. 통계에서 표준 편차나 분산 구할때 제곱을 하는 이유와 비슷합니다. )
linear_model - y 는 각 요소가 해당 예제의 오류(손실) 델타인 벡터를 만듭니다. 그리고 tf.square를 호출하여 오류를 제곱합니다. 그런 다음 모든 제곱 된 오류를 합하여 tf.reduce_sum을 사용하여 모든 예제의 오류를 추상화하는 단일 스칼라를 만듭니다.

y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))
실행하면 아래와 같은 결과가 나옵니다.
23.66
예제소스
import tensorflow as tf

sess = tf.Session()
file_writer = tf.summary.FileWriter('E:/work/ai/anaconda', sess.graph)

W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b

init = tf.global_variables_initializer()
sess.run(init)

y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)

print(sess.run(squared_deltas, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))

file_writer.add_graph(sess.graph)

file_writer.close()

코드의 이해
아래 엑셀 표를 보면 23.66 이라는 값이 어떻게 나왔는지 이해하기가 쉽습니다. x, y는 각각 외부에서 정해놓은 값이 되며, W, b는 조정을 해서 y와 비교시 오차가 최소가 되도록 맞추는게 최종 목표입니다.
그런데 W:0.3, b:-0.3 의 값이 고정되어 있기 때문에 오차 제곱의 합은 23.66이 될 수 밖에 없습니다.



W와 b의 값을 -1과 1의 완벽한 값으로 재 할당하여 수동으로 향상시킬 수 있습니다. 변수는 tf.Variable 에 인자로 제공된 값으로 초기화되지만 tf.assign과 를 이용하여 변경할 수도 있습니다.

최종 결과는 오차가 0임을 보여줍니다.
0.0
W와 b의 "완벽한"값을 (수동으로)추측했지만 기계 학습의 요점은 올바른 모델 매개 변수를 자동으로 찾는 것입니다.

W:-1, b:1일때



2017년 11월 13일 월요일

텐서플로 시작하기(Getting started With TensorFlow)(1)


텐서플로 시작하기 Getting Started With TensorFlow



이글은 영어 원본을 읽고 공부하면서 불필요한 내용 빼고 이해하기 쉽도록 적절히 내맘대로 작성해보았습니다. 이해가 잘못되어 원저자의 의도대로 번역이 안되어 있을 수도 있습니다. 이점 참고해서 읽어 주시면 고맙겠습니다

설치하기 예제


The lowest level API : TensorFlow Core - 전문가 사용을 추천
A high-level API : 사용하기 쉬움


Tensors

텐서플로에서 데이터의 단위, 원시적인 값의 집합으로 구성된 텐서는 임의의 차원의 배열의 형태를 가지고 있습니다.
tensor의 rank라는게 있는데 자세히 보면 우리가 알고있는 차원의 수를 rank라고 합니다. . 아래 표시된 예제를 자세히 살펴보면, [1.,2.,3.] 이란 1차원 값들은 rank 1 이며, 1차원이니 vector이며 1차원 [3] 형태로 표시가 가능합니다.
3 # a rank 0 tensor; a scalar with shape []
[1., 2., 3.] # a rank 1 tensor; a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]
3 # a rank 0 tensor; a scalar with shape []
[1., 2., 3.] # a rank 1 tensor; a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]
3 # a rank 0 tensor; a scalar with shape []
[1., 2., 3.] # a rank 1 tensor; a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]
3 # a rank 0 tensor; a scalar with shape []
[1., 2., 3.] # a rank 1 tensor; a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]
3 # a rank 0 tensor; a scalar with shape []
[1., 2., 3.] # a rank 1 tensor; a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]
3 # a rank 0 tensor; a scalar with shape []
[1., 2., 3.] # a rank 1 tensor; a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]

TensorFlow Core

TensorFlow 임포트하기
텐서플로를 파이썬에서 import하기위해서는 아래와 같이 사용합니다.
import tensorflow as tf

계산적인 그래프

TensorFlow Core programs은 두가지 섹션으로 구별됨
  1. 계산적인 graph 생성
  2. 계산적인 graph 실행
계산적인 그래프는 노드의 그래프로 배열한 텐서플로 동작의 연속을 의미한다.
계산적인 간단한 그래프 생성 하기: 각각의 노드는 입력을 위해서 0 또는 그 이상의 텐서를 가져가고 출력으로는 텐서 하나를 생성합니다. 노드의 하나의 형태는 상수입니다. 모든 텐서플로 상수와 같이, 그것은 입력을 가져가지 않고 그것은 내부적으로 저장된 값을 출력합니다. 우리는 두개의 부동 소수점 텐서 node1, node2 개를 다음과 같이 생성하였습니다.
예제에서 tf.constant 는 노드로 상수를 만든다는 의미이고, dtype은 type을 의미하며, implicitly 이것은 암묵적으로 tf.float32 이란 의미입니다. 
결론을 놓고 보자면 node1,node2 라는 텐서를 만드는 예제이고 해당 텐서는 상수값 3.0, 4.0을 가진 tf.float32 라는 의미입니다.
node1 = tf.constant(3.0, dtype=tf.float32) node2 = tf.constant(4.0) # also tf.float32 implicitly print(node1, node2)
이것을 실행해서 출력해보면 print 명령에 의해서 아래와 같이 출력됩니다.
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
출력에서 3.0, 4.0값은 출력되지 않습니다.  출력을 위해서는 계산적인 그래프를 session 에서 실행 시켜야 합니다. session은 텐서플로의 실행의 상태와 제어를 추상화 되어있습니다.
다음 코드는 Session 객체를 만든 다음 run 메소드를 호출하여 node1과 node2를 계산할 수있는 계산적인 그래프를 실행합니다.
sess = tf.Session() print(sess.run([node1, node2]))
우리는 예상된 결과 3.0, 4.0을 보게 됩니다.
[3.0, 4.0]
우리는 텐서를 이용해 좀 더 복잡한 계산을 할 수 있습니다.(Operations)동작 또한 노드가 됩니다. 아래 예에는 두개의 상수를 tf.add를 이용해 더할 수 있고 생성은 node3이 생성됩니다.
node3 = tf.add(node1, node2) print("node3:", node3) print("sess.run(node3):", sess.run(node3))
아래와 같은 결과가 나옵니다.
node3: Tensor("Add:0", shape=(), dtype=float32) sess.run(node3): 7.0
텐서플로는 계산적 그래프 이미지를 볼 수 있는 텐서보드라고 불리는 유틸을 제공합니다. 텐서보드로 보면 아래와 같이 보이게 됩니다.
TensorBoard screenshot
이 그래프는 항상 일정한 결과를 산출하기 때문에 특히 흥미 롭지 않습니다. placeholder라고 하는 외부 입력을 허용하도록 그래프를 매개 변수화 할 수 있습니다. placeholder는 나중에 값을 제공하겠다는 약속입니다.
a = tf.placeholder(tf.float32) b = tf.placeholder(tf.float32) adder_node = a + b  # + provides a shortcut for tf.add(a, b)
위의 세 줄은 함수 또는 람다(익명함수)와 비슷하지만 두 개의 입력 매개 변수 (a 및 b)를 정의한 다음 해당 매개 변수에 대한 연산을 정의합니다. run메소드에 대한 feed_dict 인수를 사용하여 구체적인 값을 placeholder에 공급함으로써 이 그래프를 여러 입력으로 평가할 수 있습니다.
print(sess.run(adder_node, {a: 3, b: 4.5})) print(sess.run(adder_node, {a: [1, 3], b: [2, 4]}))
출력 결과
7.5 [ 3.  7.]
텐서보드에서 아래와 같이 나타납니다.
TensorBoard screenshot
우리는 계산적인 그래프를 다른 동작(아래 예)을 추가함으로서 좀 더 복잡하게 만들 수 있습니다.
add_and_triple = adder_node * 3. print(sess.run(add_and_triple, {a: 3, b: 4.5}))
결과
22.5
텐서보드에서 나타내면 아래와 같이 나타난다고 합니다.
TensorBoard screenshot

텐서보드 사용하기

텐서 보드 실행
(E:\Users\aas\Anaconda3) E:\work\ai\anaconda>python -m tensorboard.main --logdir=E:/work/ai/anaconda
TensorBoard 0.4.0rc2 at http://DESKTOP-D579QI:6006 (Press CTRL+C to quit)
여기에서는 로그 폴더를 다음과 같이 설정 하였습니다. E:/work/ai/anaconda 
실행시키면 http://DESKTOP-D579QI:6006 비슷한 주소가 뜨는데 PC마다 조금씩 다른 주소가 뜹니다. 해당 주소 6006 포트로 접속하면 됩니다.

사용상 알아두면 좋은점
http://localhost:6006/ 주소를 localhost로 연결해도 동일합니다.
텐서보드 동작이 잘안되는경우 
log폴더랑 실행 시켜주는 폴더랑 다른 경우가 아닌지 확인요망
즉, log 폴더가 E drive에 있다면 있다면 E 드라이브로 이동된 상태에서 실행하도록 합니다. E:\work\ai\anaconda>python -m tensorboard.main --logdir=E:/work/ai/anaconda


그리고 지금까지 구현한 소스를 그래프를 그릴 수 있도록 약간 변형하였습니다. 
아래 예제에서도 로그 폴더를 자신의 폴더에 맞게 적절히 조정합니다.

텐서 보드 예제
import tensorflow as tf

sess = tf.Session()
file_writer = tf.summary.FileWriter('E:/work/ai/anaconda', sess.graph)

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b  # + provides a shortcut for tf.add(a, b)

add_and_triple = adder_node * 3.
print(sess.run(add_and_triple, {a: 3, b: 4.5}))

file_writer.add_graph(sess.graph)
file_writer.close()
해당 소스를 텐서보드를 실행했던 창외에 추가로 다른 anaconda prompt를 열고 실행시킵니다. 그리고 나서 브라우저로 텐서보드를 열고 리로드 해보면 위 그림과 조금 다르지만 전체적으로 같은 형태의 그림을 볼 수 있습니다.