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를 열고 실행시킵니다. 그리고 나서 브라우저로 텐서보드를 열고 리로드 해보면 위 그림과 조금 다르지만 전체적으로 같은 형태의 그림을 볼 수 있습니다.



댓글 없음:

댓글 쓰기