[TensorFlow] 자료형과 기본적인 사용법
https://www.tensorflow.org/programmers_guide/graphs#building_a_tfgraph
텐서플로우는 dataflow-graph를 구성하고, graph의 일부를 Session으로 구성해 실행시키는 방식이다.
Note ) 단순히 TensorFlow API를 호출하는 것 만으로도 tf.Graph에 tf.Operation(Node)와 tf.Tensor(Edge)가 추가된다.
따라서 노드가 추가될 graph를 명시할 수 있는데, 명시하지 않는 경우 default graph에 추가된다.
다른 graph에 노드를 추가하려면 ``py graph.as_default()``를 사용한다.
* ``py with``가 끝나면 다시 default context다.
```python
>>> import tensorflow as tf
>>> g1 = tf.Graph()
>>> with g1.as_default() as graph:
... const1 = tf.constant(3) # g1에 const1 Node 생성 및 추가
...
>>> sess = tf.Session() # graph 명시하지 않으면 default graph 사용
>>> sess.run(const1)
RuntimeError: The Session graph is empty. Add operations to the graph before calling run().
>>> sess1 = tf.Session(graph=g1)
>>> sess1.run(const1)
3
```
* default graph와 default session은 현재 thread의 속성이다. 따라서 multi-thread인 경우 각각의 thread마다 다른 default graph/session을 가진다.
* default graph는 자동으로 생성되며 default session은 `` None``이 기본이다.
이렇게 생성된 그래프를 실행하기 위해서는 tf.Session 객체를 이용한다.
연산의 시작 지점이 되는 가지를 ``py sess.run(fetches)``로 넘기면, 그 가지를 따라서 연산이 시작되는 방식이기 때문에 항상 그래프 전체를 실행할 필요 없이 그래프의 일부분(`` fetches``)만 넘겨서 실행할 수 있다.
또, `` feed_dict``를 Session에 지정하기 때문에 같은 `` fetches``를 넘겨 graph의 같은 부분을 실행하더라도 서로 다른 상태(가중치 값)를 가지는 여러 Session을 만들 수 있다.
Session은 graph의 일부분(+초기값)을 대상으로 정의되기 때문에 graph에 종속적이다.
``py Session(graph='')``을 호출하면서 graph를 지정할 수 있으며 지정하지 않으면 default graph를 사용한다.
Note ) ``py sess.run()``에 여러 fetches를 넘기더라도, 각 노드의 값을 산출하기 위한 Ops는 한 번씩만 수행된다.
그러니까, 성능 고려할 필요 없이 무엇을 반환할지만 생각하면 된다.
tf.constant
========== constant ===========
node1: Tensor("Const:0", shape=(), dtype=float32)
node2: Tensor("Const_1:0", shape=(), dtype=float32)
node3: Tensor("Add:0", shape=(), dtype=float32)
sess.run(node1, node2): (3.0, 4.0)
sess.run(node3): 7.0
```
tf.placeholder
========== placeholder ===========
7.5
[ 3. 7.]
```
tf.Variable
========== Variable ===========
va, vb : (array([[1, 2, 3]], dtype=int32), array([[1, 2, 3]], dtype=int32))
result : [[14]]
```
Variable Scope
TensorFlow의 Variable scope 매커니즘은 두 개의 메인 함수로 구성되어 있다.
https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/how_tos/variable_scope/
https://www.tensorflow.org/api_docs/python/tf/get_variable
tf.get_variable(<name>, <shape>, <initializer>)
Creates or returns a variable with a given name. ``py tf.Variable()`` 을 반환한다.
``py tf.Variable()`` 은 value를 직접 지정하는 반면
``py tf.get_variable()`` 은 initializer(shape을 넘기면 그 shape의 tensor를 반환하는 함수)를 지정하는 식으로 사용한다.
```python
v1 = tf.get_variable("v1", shape=[3], initializer = tf.contrib.layers.xavier_initializer())
```
tf.variable_scope(<scope_name>)
Manages namespaces for names passed to ``py tf.get_variable()``.
``py tf.variable_scope()`` 를 사용해 ``py tf.get_variable()`` 로 선언한 변수들을 각자 다른 namespace로 관리할 수 있다.
'Machine Learning > TensorFlow' 카테고리의 다른 글
[TensorFlow] estimator (0) | 2017.11.15 |
---|---|
[TensorFlow] Datasets API (0) | 2017.11.14 |
[TensorFlow] TensorBoard (0) | 2017.04.23 |
[TensorFlow] <lagacy> input pipelines / Threading and Queue (0) | 2017.04.22 |
[TensorFlow] CNN (0) | 2017.04.22 |