[TensorFlow] 기초 개념 및 수행 결과 _ 1. 기본적인 자료형 소개 및 결과값



소스 코드는 https://github.com/melonicedlatte/tensorflow_basic/tree/master 에 모두 올라와 있습니다. 


tensorflow 자료형

핵심 : 그래프를 생성하고, 그래프를 세션에 넣어 그래프를 수행한다

기본 개념 익히기

일단 기본 용어부터 살펴보겠습니다.

용어

오퍼레이션(Operation)

  • 그래프 상의 노드는 오퍼레이션(줄임말 op)으로 불립니다. 오퍼레이션은 하나 이상의 텐서를 받을 수 있습니다. 오퍼레이션은 계산을 수행하고, 결과를 하나 이상의 텐서로 반환할 수 있습니다.

텐서(Tensor)

  • 내부적으로 모든 데이터는 텐서를 통해 표현됩니다. 텐서는 일종의 다차원 배열인데, 그래프 내의 오퍼레이션 간에는 텐서만이 전달됩니다. (Caffe의 Blob과 유사합니다.)

세션(Session)

  • 그래프를 실행하기 위해서는 세션 객체가 필요합니다. 세션은 오퍼레이션의 실행 환경을 캡슐화한 것입니다.

변수(Variables)

  • 변수는 그래프의 실행시, 패러미터를 저장하고 갱신하는데 사용됩니다. 메모리 상에서 텐서를 저장하는 버퍼 역할을 합니다.


Hello, TensorFlow! 출력해보기

In [3]:
import tensorflow as tf
In [7]:
tf.Session()
Out[7]:
<tensorflow.python.client.session.Session at 0x7fe83c71a470>
In [9]:
sess = tf.Session()
In [11]:
tf.constant('Hello, TensorFlow!')
Out[11]:
<tf.Tensor 'Const_2:0' shape=() dtype=string>
In [10]:
hello = tf.constant('Hello, TensorFlow!')
In [13]:
sess.run(hello)
Out[13]:
b'Hello, TensorFlow!'


placeholder

  • placeholder는 그래프를 만들지 않는다.
  • input 데이터를 받아두는 공간 (텐서를 매핑시킬 때 사용)
  • 메소드 같은 역할
  • 학습용 데이타를 담는 그릇을 플레이스홀더(placeholder)라고 한다.
  • 플레이스홀더에 대해서 알아보면, 플레이스 홀더의 위의 그래프에서 x 즉 입력값을 저장하는 일종의 통(버킷)이다.

tf.placeholder(dtype,shape,name)

- dtype : 플레이스홀더에 저장되는 데이타형이다. tf.float32와 같이 실수,정수등의 데이타 타입을 정의한다.
- shape : 행렬의 차원을 정의한다. shapre=[3,3]으로 정의해주면, 이 플레이스홀더는 3x3 행렬을 저장하게 된다.
- name : name은 이 플레이스 홀더의 이름을 정의한다.


Variable

  • 하나의 객체
  • weight 를 정의할 때 사용한다.
  • 타입을 정의 해주는 것이 좋다. (타입을 맞춰야 연산 시에 type 에러가 발생할 확률이 적어진다.)
  • y=W*x+b 라는 학습용 가설이 있을때, x가 입력데이타 였다면, W와 b는 학습을 통해서 구해야 하는 값이 된다. 이를 변수(Variable)이라고 하는데, 변수형은 Variable 형의 객체로 생성이 된다.

tf.Variable.init(initial_value=None, trainable=True, collections=None, validate_shape=True, caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None, import_scope=None)


Constant

  • 상수를 정의
  • 메소드
  • 상수형은 말 그대로 상수를 저장하는 데이타 형이다.

tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)

- value : 상수의 값이다.
- dtype : 상수의 데이타형이다. tf.float32와 같이 실수,정수등의 데이타 타입을 정의한다.
- shape : 행렬의 차원을 정의한다. shape=[3,3]으로 정의해주면, 이 상수는 3x3 행렬을 저장하게 된다.
- name : name은 이 상수의 이름을 정의한다.
In [18]:
placeholder = tf.placeholder(tf.float32, shape=(3,3))
Variables = tf.Variable([1,2,3,4,5], dtype = tf.float32 )
constant = tf.constant([10,20,30,40,50], dtype = tf.float32)


아래와 같은 연산을 허용하지 않는다.

In [19]:
a = 5 * 4 
print (a) 
20

아래와 같이 텐서가 이렇게 생겼다라는 모양만 준다.

In [21]:
print(placeholder)
Tensor("Placeholder_3:0", shape=(3, 3), dtype=float32)
In [22]:
print(Variables)
Tensor("Variable_1/read:0", shape=(5,), dtype=float32)

그렇다면 연산을 어떻게 해야 할까요???

  • 텐서플로우의 핵심 == 그래프를 생성한다
  • 세션 안에 그래프를 넣고, 세션 run() 함수를 통해 그래프의 최종 값을 얻는다.
  • 세션은 일종의 파일이라고 생각하자. (열고 닫는다)
  • 세션의 run() 함수는 값을 리턴
In [24]:
sess = tf.Session()
result = sess.run(constant)
result 
Out[24]:
array([ 10.,  20.,  30.,  40.,  50.], dtype=float32)
------session------
| a + ㅁ + ㅁ => d |
|     |    |      |
|     b    c      |
-------------------
ㅁ 를 placeholder 라고 생각하자
In [26]:
a = tf.constant([5], dtype = tf.float32)
b = tf.constant([6], dtype = tf.float32)
c = tf.constant([7], dtype = tf.float32)
d = a + b + c
d
Out[26]:
<tf.Tensor 'add_3:0' shape=(1,) dtype=float32>
In [27]:
sess.run(d)
Out[27]:
array([ 18.], dtype=float32)


변수(Variable)을 동일하게 해보면??

  • 에러 발생
  • variable은 반드시 초기화가 필요한 텐서이다 (초기화 함수를 호출해야 한다.)
  • 그래프는 variable 도 동일하게 만든다
In [29]:
var1 = tf.Variable([1], dtype = tf.float32 )
var2 = tf.Variable([2], dtype = tf.float32 )
var3 = tf.Variable([3], dtype = tf.float32 )
var4 = var1 + var2 + var3
var4
Out[29]:
<tf.Tensor 'add_7:0' shape=(1,) dtype=float32>
In [30]:
sess.run(var4)
---------------------------------------------------------------------------
FailedPreconditionError                   Traceback (most recent call last)
/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
   1020     try:
-> 1021       return fn(*args)
   1022     except errors.OpError as e:

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in _run_fn(session, feed_dict, fetch_list, target_list, options, run_metadata)
   1002                                  feed_dict, fetch_list, target_list,
-> 1003                                  status, run_metadata)
   1004 

/usr/lib/python3.5/contextlib.py in __exit__(self, type, value, traceback)
     65             try:
---> 66                 next(self.gen)
     67             except StopIteration:

/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/errors_impl.py in raise_exception_on_not_ok_status()
    468           compat.as_text(pywrap_tensorflow.TF_Message(status)),
--> 469           pywrap_tensorflow.TF_GetCode(status))
    470   finally:

FailedPreconditionError: Attempting to use uninitialized value Variable_5
	 [[Node: Variable_5/read = Identity[T=DT_FLOAT, _class=["loc:@Variable_5"], _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_5)]]

During handling of the above exception, another exception occurred:

FailedPreconditionError                   Traceback (most recent call last)
<ipython-input-30-f9e321651329> in <module>()
----> 1 sess.run(var4)

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, options, run_metadata)
    764     try:
    765       result = self._run(None, fetches, feed_dict, options_ptr,
--> 766                          run_metadata_ptr)
    767       if run_metadata:
    768         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
    962     if final_fetches or final_targets:
    963       results = self._do_run(handle, final_targets, final_fetches,
--> 964                              feed_dict_string, options, run_metadata)
    965     else:
    966       results = []

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)
   1012     if handle is None:
   1013       return self._do_call(_run_fn, self._session, feed_dict, fetch_list,
-> 1014                            target_list, options, run_metadata)
   1015     else:
   1016       return self._do_call(_prun_fn, self._session, handle, feed_dict,

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
   1032         except KeyError:
   1033           pass
-> 1034       raise type(e)(node_def, op, message)
   1035 
   1036   def _extend_graph(self):

FailedPreconditionError: Attempting to use uninitialized value Variable_5
	 [[Node: Variable_5/read = Identity[T=DT_FLOAT, _class=["loc:@Variable_5"], _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_5)]]

Caused by op 'Variable_5/read', defined at:
  File "/usr/lib/python3.5/runpy.py", line 184, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.5/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/gohn/.local/lib/python3.5/site-packages/ipykernel/__main__.py", line 3, in <module>
    app.launch_new_instance()
  File "/home/gohn/.local/lib/python3.5/site-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/home/gohn/.local/lib/python3.5/site-packages/ipykernel/kernelapp.py", line 474, in start
    ioloop.IOLoop.instance().start()
  File "/home/gohn/.local/lib/python3.5/site-packages/zmq/eventloop/ioloop.py", line 177, in start
    super(ZMQIOLoop, self).start()
  File "/home/gohn/.local/lib/python3.5/site-packages/tornado/ioloop.py", line 887, in start
    handler_func(fd_obj, events)
  File "/home/gohn/.local/lib/python3.5/site-packages/tornado/stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "/home/gohn/.local/lib/python3.5/site-packages/zmq/eventloop/zmqstream.py", line 440, in _handle_events
    self._handle_recv()
  File "/home/gohn/.local/lib/python3.5/site-packages/zmq/eventloop/zmqstream.py", line 472, in _handle_recv
    self._run_callback(callback, msg)
  File "/home/gohn/.local/lib/python3.5/site-packages/zmq/eventloop/zmqstream.py", line 414, in _run_callback
    callback(*args, **kwargs)
  File "/home/gohn/.local/lib/python3.5/site-packages/tornado/stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "/home/gohn/.local/lib/python3.5/site-packages/ipykernel/kernelbase.py", line 276, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "/home/gohn/.local/lib/python3.5/site-packages/ipykernel/kernelbase.py", line 228, in dispatch_shell
    handler(stream, idents, msg)
  File "/home/gohn/.local/lib/python3.5/site-packages/ipykernel/kernelbase.py", line 390, in execute_request
    user_expressions, allow_stdin)
  File "/home/gohn/.local/lib/python3.5/site-packages/ipykernel/ipkernel.py", line 196, in do_execute
    res = shell.run_cell(code, store_history=store_history, silent=silent)
  File "/home/gohn/.local/lib/python3.5/site-packages/ipykernel/zmqshell.py", line 501, in run_cell
    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
  File "/home/gohn/.local/lib/python3.5/site-packages/IPython/core/interactiveshell.py", line 2717, in run_cell
    interactivity=interactivity, compiler=compiler, result=result)
  File "/home/gohn/.local/lib/python3.5/site-packages/IPython/core/interactiveshell.py", line 2821, in run_ast_nodes
    if self.run_code(code, result):
  File "/home/gohn/.local/lib/python3.5/site-packages/IPython/core/interactiveshell.py", line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-29-58056d2b91ef>", line 1, in <module>
    var1 = tf.Variable([1], dtype = tf.float32 )
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/variables.py", line 224, in __init__
    expected_shape=expected_shape)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/variables.py", line 370, in _init_from_args
    self._snapshot = array_ops.identity(self._variable, name="read")
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/gen_array_ops.py", line 1424, in identity
    result = _op_def_lib.apply_op("Identity", input=input, name=name)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op
    op_def=op_def)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 2240, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 1128, in __init__
    self._traceback = _extract_stack()

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value Variable_5
	 [[Node: Variable_5/read = Identity[T=DT_FLOAT, _class=["loc:@Variable_5"], _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_5)]]


In [31]:
init = tf.initialize_all_variables()
sess.run(init)
sess.run(var4)
WARNING:tensorflow:From <ipython-input-31-1b4cfb75d81a>:1 in <module>.: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.
Instructions for updating:
Use `tf.global_variables_initializer` instead.
Out[31]:
array([ 6.], dtype=float32)

위의 함수보단 아래의 함수를 추천한다고 하니 아래의 함수를 사용해보자

In [32]:
init = tf.global_variables_initializer()
sess.run(init)
sess.run(var4)
Out[32]:
array([ 6.], dtype=float32)



placeholder

  • tensor와 데이터를 매핑 시키는 역할을 함
  • 그래프를 만들지 않는다
  • pandas , numpy, 파이선 기본 자료형을 텐서로 매핑

feeding

변수를 텐서로 인식한다!!

In [35]:
value1 = 5
value2 = 3
value3 = 2
ph1 = tf.placeholder(dtype=tf.float32)
ph2 = tf.placeholder(dtype=tf.float32)
ph3 = tf.placeholder(dtype=tf.float32)
result_value = ph1 * ph2 * ph3 
feed_dict = {ph1: value1, ph2: value2, ph3: value3 }
In [36]:
sess.run(result_value, feed_dict = feed_dict) 
Out[36]:
30.0
In [40]:
image = [1,2,3,4,5]
label = [10,20,30,40,50]
ph_image = tf.placeholder(dtype=tf.float32)
ph_label = tf.placeholder(dtype=tf.float32)
feed_dict = {ph_image: image, ph_label: label }
result_value = ph_image + ph_label
sess.run(result_value, feed_dict = feed_dict) 
Out[40]:
array([ 11.,  22.,  33.,  44.,  55.], dtype=float32)
In [41]:
image = [1,2,3,4,5]
label = [10,20,30,40,50]
ph_image = tf.placeholder(dtype=tf.float32)
ph_label = tf.placeholder(dtype=tf.float32)
feed_dict = {ph_image: image, ph_label: label }
result_value = ph_image * ph_label
sess.run(result_value, feed_dict = feed_dict) 
Out[41]:
array([  10.,   40.,   90.,  160.,  250.], dtype=float32)