TensorFlow 기본 개념 (2)
연산은 Graph
로 이뤄 진다.Graph
는 Session
Context
에 들어가서 처리 된다.Data
는 Tensor로 표현된다.
상태 정보는 Variables
로 관리 된다.
Session
반드시 그래프의 실행은 Session
안에서 이뤄져야 한다.Session
은 Graph ops
를 CPUs
, GPUs
와 같은 장치에서 실행 시킨다.
그리고 실행 결과로 ndarray
object를 반환 한다.
Simple Example
Building the graph
import tensorflow as tf
# Create a Constant op that produces a 1x2 matrix. The op is
# added as a node to the default graph.
#
# The value returned by the constructor represents the output
# of the Constant op.
matrix1 = tf.constant([[3., 3.]])
# Create another Constant that produces a 2x1 matrix.
matrix2 = tf.constant([[2.],[2.]])
# Create a Matmul op that takes 'matrix1' and 'matrix2' as inputs.
# The returned value, 'product', represents the result of the matrix
# multiplication.
product = tf.matmul(matrix1, matrix2)
위 코드는 Graph
를 생성하는 코드이다.
현재 Default Graph
는 3개의 Node로 구성된다.
두 개의 constant()
그리고 하나의 matmul()
op 함수이다.
Matrix1
: 1x2Matrix2
: 2x1
하지만, 지금은 정의만 한것이다. 앞선 기본개념에서도 언급 했듯이 TensorFlow
는 정의 부분과 실행 부분이 나눠진다.
실제 seesion
에서 해당 Graph
를 실행해야 비로소 연산이 실행 된다.
Launching the graph in a session
# Launch the default graph.
sess = tf.Session()
# To run the matmul op we call the session 'run()' method, passing 'product'
# which represents the output of the matmul op. This indicates to the call
# that we want to get the output of the matmul op back.
#
# All inputs needed by the op are run automatically by the session. They
# typically are run in parallel.
#
# The call 'run(product)' thus causes the execution of three ops in the
# graph: the two constants and matmul.
#
# The output of the op is returned in 'result' as a numpy `ndarray` object.
result = sess.run(product)
print(result)
# ==> [[ 12.]]
# Close the Session when we're done.
sess.close()
위 코드는 Graph
를 Launch하는 코드이다. 이를 위해서 Session
object를 생성 한다.
어떠한 Argument
도 없이 session을 생성하면 default graph
로 실행 된다.
최종적으로 matrix연산을 수행한 후에 ndarry
object 형태로 실수 12.
이 반환 된다.
Session
은 반드시 close
시켜서 resource
해제 시켜줘야 한다.
With blockwith
를 이용하면 자동으로 with block
이 끝나는 지점에서 리소스를 반환하게 된다.
with tf.Session() as sess:
result = sess.run([product])
print(result)
TensorFlow의 구현은 Graph
정의를 실행가능한 operation으로 변환하는 것을 말한다.
그리고 이러한 operation은 현재 가능한 컴퓨팅 리소스 (CPU, GPU card)등에 할당 된다.
이 작업은 추상화되어 프로그래머가 명시적으로 해줘야할 것은 없다.
장치가 여러개일 경우
with tf.Session() as sess:
with tf.device("/gpu:1"):
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
...
위와 같이 직접 하드웨어를 선택해서 처리 한다.
"/cpu:0": The CPU of your machine.
"/gpu:0": The GPU of your machine, if you have one.
"/gpu:1": The second GPU of your machine, etc.
Interactive Usage
# Enter an interactive TensorFlow Session.
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])
# Initialize 'x' using the run() method of its initializer op.
x.initializer.run()
# Add an op to subtract 'a' from 'x'. Run it and print the result
sub = tf.sub(x, a)
print(sub.eval())
# ==> [-2. -1.]
# Close the Session when we're done.
sess.close()
Tensor
Tensor는 n-dimensional array
도는 list
를 말한다.
Variables
import tensorflow as tf
# Create a Variable, that will be initialized to the scalar value 0.
state = tf.Variable(0, name="counter")
# Create an Op to add one to `state`.
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# Variables must be initialized by running an `init` Op after having
# launched the graph. We first have to add the `init` Op to the graph.
init_op = tf.initialize_all_variables()
# Launch the graph and run the ops.
with tf.Session() as sess:
# Run the 'init' op
sess.run(init_op)
# Print the initial value of 'state'
print(sess.run(state))
# Run the op that updates 'state' and print 'state'.
for _ in range(3):
sess.run(update)
print(sess.run(state))
# output:
# 0
# 1
# 2
# 3
Graph
의 실행 상태를 저장하는 것이 Variables
의 특징이다.
위 예제에서의 Variables
는 간단한 counter의 역할을 하게 된다.
assign()
operation은 add()와 같은 graph상의 하나의 operation이다. 당연히 session.run()을 하기 전까지는 실행 되지 않는다.- Neural network에서 tensor에 weight값으 저장할 때
Variables
를 사용하게 된다.
Fetches
input1 = tf.constant([3.0])
input2 = tf.constant([2.0])
input3 = tf.constant([5.0])
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)
with tf.Session() as sess:
result = sess.run([mul, intermed])
print(result)
# output:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
Graph
의 실행은 결국 run
을 이용해서 수행하게 된다.
Feeds
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))
# output:
# [array([ 14.], dtype=float32)]
이전 까지 예제들은 Constants
와 Variables
에 저장된 값을 가지고 graph를 연산하는 것을 배웠다.
동적으로 값을 전달하는 방법을 알아보자.
run()을 할 때 Argument
로 전달할 수 있는 매커니즘을 말한다.
placeholder
라는 이름으로 선언하면 run()을 할 때 값을 정해주는 기능으로 동작하게 된다.
주의할 것은 정의를 하지 않으면 error
를 발생 시킨다는 점이다. 반드시 초기화를 해줘야 한다.
작성코드
본 내용에 작성된 코드들은 Github
를 통해서 공유하겠습니다.
주소: https://github.com/leejaymin/TensorFlowLecture/tree/master/0.Basic
'AI > TensorFlow, PyTorch, Keras, Scikit' 카테고리의 다른 글
rpy2 Windows 10에 설치 하기 (0) | 2016.12.13 |
---|---|
Python에서 rpy2를 이용한 ROjbect 불러오기 (3) | 2016.12.12 |
MNIST 데이터 셋을 이용한 손글씨 인식 Deep Neural Network 구현 (6) | 2016.07.07 |
TensorFlow 기본 개념 (1) (0) | 2016.07.01 |
TensorFlow 버전 업데이트 (Version Update) (4) | 2016.06.15 |