데이터분석/Tensorflow

[Tensorflow] tensorflow 기본 설명 (tensor, variables, fetches, feeds, session, etc)

쌍쌍바나나 2017. 2. 7. 22:00
반응형

overview

  tensorflow는 graphs의 형태로 나타내는 프로그래밍 시스템을 말합니다. 그래프에 있는 노드들은 operations이라고 불리우는데, 줄여서 ops라고 칭합니다. op는 Tensor로 이루어져 있고, tensors간에 computaiton을 수행하게 됩니다. tensor는 multi-dimentional array형태로 되어있다. Tensorflow graph를 연산하기 위해서는 Session을 launch를 해야한다. Session은  Devices(CPUs, GPUs)위에서 연산을 실행한 후에 결과를 반환한다. 

The computation graph

  Tensorflow 프로그램은 graph의 형태로 되어 있고, 그래프에 있는 ops의 연산을 수행하기 위해  session을 이용한다. 예를들어서 뉴럴네트워크를 구성한다고 할때, 그래프를 생성하는 부분과, 반복적으로 ops를 training하는 실행하는 부분이 있습니다. Tensorflow는 C, C++ 그리고 python 프로그램이 사용될 수 있습니다. C, C++라이브러리에서는 사용할 수 없는 함수들을 사용할 수 있기 때문에 그래프를 생성하거나 할때 python을 이용하는게 쉽습니다. session 라이브러리는 기능적으로는 모두 3가지 언어가 동일합니다. 

Building the graph

  그래프프는 각 노드, 즉 ops로 이루어져 있기 때문에 아래에서 constant를 이용해서 노드를 생성해 보도록 하겠습니다. 


import tensorflow as tf


matrix1 = tf.constant([[3., 3.]])

matrix2 = tf.constant([[2.],[2.]]) 

product = tf.matmul(matrix1, matrix2)


여기서는 실제로 3개의 노드로 이루어진 그래프를 생성하였고,

실제로 두개의 matrix를 곱하는 연산을 해서 결과를 얻기 위해서는 graph를 session에 launch해야 합니다. 

Launching the graph in a session

  graph를 launch하기 위해서는 첫번째로 Session object를 생성해야 합니다. 


sess = tf.Session()

result = sess.run(product)

print result) # [[ 12. ]]

sess.close()


session에서 사용한 resources를 release하기 위해서는 반드시 closed를 해줘야 합니다. closed 대신에 with를 사용하면 block안에서만 session이 유효하게 됩니다.


with tf.Session() as sess:

    result = sess.run([product])

    print result


Tensorflow는 위에서 정의한 graph를 CPU, GPU에서 동작시킬 수 있도록 구현이 가능합니다.  tesorflow에서 만약 gpu를 사용할 수 있으면, 많은 연산이 가능합니다.  만약 gpu가 한개 이상이 있으면, 특정 gpu를 지정을 해줘야 합니다. 


with tf.Session() as sess:

    with tf.device(“/gpu:1”):

        matrix1 = tf.constant([[ 3., 3.]])

        matrix2 = tf.constant([[ 3., 3.]])

        product = tf.matmul(matrix1, matrix2)


Device는 특정 string으로 사용할 수 있습니다. 

“/cpu:0”: CPU

“/gpu:0”: gpu (만약 한개라면)

“/gpu:1”: 두번째 gpu



Launching the graph in a distributed session

  클러스터내에 Tensorflow server를 실행하면, 원격에서도 Tensorflow를 사용할 수 있습니다. 


with tf.Session(“grpc://example.org:2222”) as sess:

    # Calls to sess.run(…) will be exsecuted on the cluster.


server는 session의 master역할을 하고, master는 클러스터 내부의 다른 machines들에게 작업을 배포합니다. 

특정 workers에게 특정 그래프를 넘기고 싶으면 아래와 같이 하면 됩니다.


with tf.device(‘/job:ps/task:0’):

   weights = tf.Variable(…)

   biases = tf.Variable(…)

Interactive Usage

  Session을 생성하고, graph를 launch하기 위해 Session.run()을 실행하는 방법이 아닌, IPython과 같은 interactive하게 사용을 하기 위해서는 InteractiveSession, Tensor.eval(), Operation.run()을 이용해서 사용이 가능합니다. (session에 variable을 holding을 유지할 필요 없이)


# 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()

Tensors

  Tensorflow에서는 모든 데이터를 표현하기 위해서 tensor data를 사용합니다. tensor는 computation graph 내의 operations의 사이에서 주고 받아지는 값을 말합니다. 쉽게 생각하면 n-dimensional array또는 list의 값이라고 생각하면 됩니다. tensor는 static type, a rank, shape를 가지고 있습니다. 

Variables

  아래는 simple counter를 구현한 내용입니다. 


# 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.global_variables_initializer()


# 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


실제로 코드는 run()을 하기 전에는 동작을 하지 않습니다. 

Fetches

  fetch는 graph의  operations를 session에서 run()하기 위해 넘겨주는 것을 말합니다. 

이전에는 한개의 node만 fetch를 했다면(state), 여러개의 노드를 fetch가 가능합니다. 


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)]

Feeds 

  위에서 언급한 Constants, Variables는 값을 저장하는 형태로 소개를 했습니다. Tensorflow에서는 feed의 mechanism을 그래프의 어떤 operation에 직접적으로 tensor를 patching하기 위해 제공합니다. 


  feed는 tensor의 값과 함께 operation의 output을 일시적으로 교체하는 것을 말합니다. run()의 argument로 feed data를 넣어주면 됩니다. feed는 오직 run을 실행할때 넘겨주기가 가능합니다. feed operation을 사용하기 위해서는 tf.placeholder()를 생성을 해야합니다.


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)]


placeholder()연산은 만약에 feed를 넣어주지 않으면 에러가 발생합니다. 

반응형