TensorFlow 기본 개념 (2)


연산은 Graph로 이뤄 진다.
Graph는 Session Context에 들어가서 처리 된다.
Data는 Tensor로 표현된다.
상태 정보는 Variables로 관리 된다.

Session

반드시 그래프의 실행은 Session안에서 이뤄져야 한다.
Session은 Graph ops를 CPUsGPUs와 같은 장치에서 실행 시킨다.
그리고 실행 결과로 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: 1x2
  • Matrix2: 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 block
with를 이용하면 자동으로 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


+ Recent posts