What is Tensorflow? - pai-plznw4me/tensorflow_basic GitHub Wiki

Deep in dive Tensorflow ์—ฐ์žฌ ๊ธ€์˜ ์ฒซ๋ฒˆ์งธ ํฌ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค.
Deep In Dive Tensorflow ์—ฐ์žฌ๋Š” ํ…์„œํ”Œ๋กœ์šฐ๋ฅผ ์ข€ ๋” ๊นŠ๊ฒŒ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ œ์ž‘๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๋‹น ํฌ์ŠคํŠธ๋Š” tensorflow ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ ๋ฐ tensorflow github ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ์ž‘ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1. Tensorflow๋ž€?

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ…์„œํ”Œ๋กœ์šฐ๋ฅผ ์†Œ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TensorFlow๋Š” ๋จธ์‹ ๋Ÿฌ๋‹์„ ์œ„ํ•œ ์—”๋“œ ํˆฌ ์—”๋“œ ์˜คํ”ˆ์†Œ์Šค ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.
๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฆฌ์†Œ์Šค๋กœ ๊ตฌ์„ฑ๋œ ํฌ๊ด„์ ์ด๊ณ  ์œ ์—ฐํ•œ ์ƒํƒœ๊ณ„๋ฅผ ํ†ตํ•ด ์—ฐ๊ตฌ์›๋“ค์€ ML์—์„œ ์ฒจ๋‹จ ๊ธฐ์ˆ ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ 
๊ฐœ๋ฐœ์ž๋“ค์€ ML์ด ์ ‘๋ชฉ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์†์‰ฝ๊ฒŒ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์™€์„œ ํ…์„œํ”Œ๋กœ์šฐ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋“ค์ด ์ถ”๊ฐ€ ๋จ์œผ๋กœ์„œ ํ”Œ๋žซํผ์œผ๋กœ ์†Œ๊ฐœ ๋˜๊ณ  ์žˆ์ง€๋งŒ
๊ธฐ๋ณธ์ ์œผ๋กœ Tensorflow ๋Š” Deep Learning ์„ ์œ„ํ•œ Framework ๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ํ…์„œํ”Œ๋กœ์šฐ๋Š” ์œ ์ €๊ฐ€ ์‰ฝ๊ฒŒ ML Application ๊ตฌํ˜„ ํ•˜๋„๋ก ๋ผˆ๋Œ€ ๋ฐ ๋ผˆ๋Œ€์—๋‹ค ์‚ด์„ ๋ถ™์ด๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋„๊ตฌ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ML Application ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ณต์žกํ•œ ์ œ์–ด ๊ณผ์ • ๋ฐ ๊ธฐํƒ€ ๊ณผ์ •์€(state ๊ด€๋ฆฌ , auto diff ๋“ฑ) Tensorflow๊ฐ€ ๋’ท๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ 
์œ ์ €๋Š” ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์œผ๋กœ์„œ ํšจ์œจ์ ์ด๊ณ  ๋Šฅ๋ฅ ์ ์œผ๋กœ ML Application์„ ๋งŒ๋“ค์ˆ˜ ์žˆ๊ฒŒ ๋„์™€ ์ค๋‹ˆ๋‹ค.

์กฐ๊ธˆ๋งŒ ๋” ๊นŠ๊ฒŒ Tensorlfow ๋ฐ”๋ผ๋ณด๊ธฐ

ํ…์„œํ”Œ๋กœ์šฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Tensorflow ์„ ์„ค๋ช…ํ•œ ๋…ผ๋ฌธ์„ ํ•œ๋ฒˆ ์—ด์–ด ๋ด…์‹œ๋‹ค.

Imgur
๋…ผ๋ฌธ์— ์†Œ๊ฐœํ•˜๋Š” ํ…์„œํ”Œ๋กœ์šฐ๋Š” ML ๋ชจ๋ธ ๊ตฌํ˜„๊ณผ ML ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ์†Œ๊ฐœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์„ Tensorflow ๊ฐ€ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋‹ค๋ผ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ํ…์„œํ”Œ๋กœ์šฐ๋กœ ๊ตฌํ˜„๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ(heterogeneous)์— ๋ฐ”๋กœ ์ ์šฉํ•˜๋‹ค๋ผ๊ณ  ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค.(๋ชจ๋ฐ”์ผ์ด๋“  ์ปดํ“จํ„ฐ๋“  ์ž„๋ฒ ๋””๋“œ ๊ธฐ๊ธฐ๋˜ ์ƒ๊ด€์—†์ด)

์˜ค๋ฅธ์ชฝ ๊ธ€์˜ HighLight ์„ ์‚ดํŽด ๋ณด๋ฉด ํ…์„œํ”Œ๋กœ์šฐ๋กœ ๊ตฌํ˜„๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ stateful dataflow garph ๋กœ ํ‘œํ˜„๋œ๋‹ค ๋ผ๋Š” ๋ฌธ์žฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
stateful, dataflow, graph ๋‹จ์–ด๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด๋ฉด์„œ ํ…์„œํ”Œ๋กœ์šฐ๋ฅผ ์ข€๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Graph

Graph๋ž€ Node์™€ Edge๋กœ ์ด๋ฃจ์–ด์ง„ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„(์˜์–ด: graph, ๋ฌธํ™”์–ด: ๊ทธ๋ผํ”„)๋Š” ์ผ๋ถ€ ๊ฐ์ฒด๋“ค์˜ ์Œ๋“ค์ด ์„œ๋กœ ์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ์„ ์ด๋ฃจ๋Š” ๊ตฌ์กฐ์ด๋‹ค.
์ผ๋ จ์˜ ๊ผญ์ง“์ ๋“ค๊ณผ ๊ทธ ์‚ฌ์ด๋ฅผ ์ž‡๋Š” ๋ณ€๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์กฐํ•ฉ๋ก ์  ๊ตฌ์กฐ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ž˜ํ”„๋ฅผ ์—ฐ๊ตฌํ•˜๋Š” ์ˆ˜ํ•™์˜ ๋ถ„์•ผ๋ฅผ ๊ทธ๋ž˜ํ”„ ์ด๋ก ์ด๋ผ๊ณ  ํ•œ๋‹ค.
โ€œ๊ทธ๋ž˜ํ”„โ€๋ผ๋Š” ์šฉ์–ด๋Š” 1878๋…„ J. J. ์‹ค๋ฒ ์Šคํ„ฐ์— ์˜ํ•ด ์ฒ˜์Œ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค [from wiki] (https://ko.wikipedia.org/wiki/%EA%B7%B8%EB%9E%98%ED%94%84_(%EC%88%98%ED%95%99))

์œ„ ๊ทธ๋ฆผ์—์„œ ๋ณด๋””๋Š” ๋™๊ทธ๋ผ๋ฏธ๋ฅผ Node๋ผ ๋ถ€๋ฅด๊ณ  ๋…ธ๋“œ์™€ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ ์„ Edge ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
Tensorflow ๋Š” ์œ„ Graph์„ ํ™œ์šฉํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
Graph ์† ๋…ธ๋“œ๋Š” ํŠน๋ณ„ํžˆ Operation ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  , Edge ๋Š” Tensor ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งŽ์€ ์—ฐ์‚ฐ ๋ฐ ๊ธฐ๋Šฅ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ…์„œํ”Œ๋กœ์šฐ๋Š” ์—ฐ์‚ฐ ๋ฐ ๊ธฐ๋Šฅ์„ Operation ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Operation ๊ณผ Operation ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” Edge ๋Š” Tensor ๋ผ๊ณ  ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ Tensor์™€ Operation ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์‚ดํŽด ๋ด…์‹œ๋‹ค.

Tensor

ํ…์„œํ”Œ๋กœ์šฐ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— Tensor์˜ ์ •์˜๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Tensors are multi-dimensional arrays with a uniform type (called a dtype). You can see all supported dtypes at tf.dtypes.DType.

ํ…์„œํ”Œ๋กœ์šฐ์—์„œ๋Š” ํ…์„œ๋ฅผ ๋‹ค์ฐจ์›์ด๋ฉด์„œ ๋™์‹œ์— ๋ฐฐ์—ด์† ๋ชจ๋“  element ์˜ DataType ์ด ๋™์ผํ•œ ๋ฐฐ์—ด ์ด๋ผ๊ณ  ์ •์˜ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด 0์ฐจ์› , 1์ฐจ์›, 2์ฐจ์› ,3์ฐจ์› ํ…์„œ๋ฅผ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Imgur
(๋งŒ์•ฝ ์ฐจ์›์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ๋ฐฉ๋ฒ•์€ ์–‘๋ ๋Œ€๊ด„ํ˜ธ ๊ฐœ ์ˆ˜๋ฅผ ์„ธ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. 3์ฐจ์›์€ ์–‘๋ ๋Œ€๊ด„ํ˜ธ์˜ ๊ฐœ ์ˆ˜ ๊ฐ€ 3๊ฐœ์ž…๋‹ˆ๋‹ค.)
ํ…์„œํ”Œ๋กœ์šฐ์—์„œ ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ…์„œ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์€ ์˜ˆ์‹œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ํ…์„œ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cancer size Age label
9 3 malignant
8 9 benign
2 2 benign
import tensorflow as tf 
data = tf.constant([9, 3, 1], [8, 2, 0], [2, 2, 0](/pai-plznw4me/tensorflow_basic/wiki/9,-3,-1],-[8,-2,-0],-[2,-2,-0))

print(x)
# >>> <tf.Tensor: shape=(3, 3), dtype=int32, numpy=
# array([[9, 3, 1],
#        [8, 2, 0],
#        [2, 2, 0]], dtype=int32)>

Operation

ํ…์„œํ”Œ๋กœ์šฐ Node ์„ Operation ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
ํ…์„œํ”Œ๋กœ์šฐ์—์„œ Opearation ์˜ ์ •์˜๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

An Operation is a node in a tf.Graph that takes zero or more Tensor objects as input, and produces zero or more Tensor objects as output. Objects of type Operation are created by calling a Python op constructor (such as tf.matmul) within a tf.function or under a tf.Graph.as_default context manager.

์š”์•ฝ ํ•˜์ž๋ฉด Operation ์€ input ์œผ๋กœ Tensor์„ 0๊ฐœ ์ด์ƒ ๋ฐ›์„์ˆ˜ ์žˆ๊ณ  ์ถœ๋ ฅ ๋˜ํ•œ 0๊ฐœ ์ด์ƒ์˜ Tensor์„ ์ถœ๋ ฅ์œผ๋กœ ๋‚ด๋ณด๋‚ผ์ˆ˜ ์žˆ๋‹ค.
๋ผ๊ณ  ์ด์•ผ๊ธฐ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ์ƒ๊ฐํ•ด ๋ณด๋ฉด Operation์€ ์ž…๋ ฅ์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ›์ง€ ์•Š์„์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ›๋Š”๋‹ค๋ฉด ํ…์„œ๋ฅผ ๋ฐ›๋Š”๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ถœ๋ ฅ ๋˜ํ•œ ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅํ•˜์ง€ ์•Š์„์ˆ˜ ์žˆ์ง€๋งŒ ์ถœ๋ ฅ์„ ํ•œ๋‹ค๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…์„œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ผ๊ณ  ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰ ์ด๋œป์€ Operation์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ํ…์„œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ์—ฐ์‚ฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด
๊ฐ€๋ น 3 + 2 ๋ฅผ ํ•ด๋ณธ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ

์ˆœ์ฐจ์ ์œผ๋กœ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
3์ด๋ผ๋Š” ์ƒ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ 
2๋ผ๋Š” ์ƒ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ 
3๊ณผ 2๋ฅผ ๋”ํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ Tensorflow ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

# 3์ด๋ผ๋Š” ์ƒ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
a = tf.constant(3)
# 2์ด๋ผ๋Š” ์ƒ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
b = tf.constant(2)
# a, b๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค. 
c = tf.add(a, b)

์œ„ ์ฝ”๋“œ์—์„œ tf.constant ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ์œผ๋กœ ์ˆซ์ž๋ฅผ ๋ฐ›๊ณ  ํ•ด๋‹น ์ˆซ์ž๋ฅผ Tensor๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰ ๊ธฐ๋Šฅ์„ ํ•˜๊ธฐ์— ์œ„ ํ…์„œํ”Œ๋กœ์šฐ ํ•จ์ˆ˜๋Š” Operation ์„ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ•œ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ๋”ํ•˜์ž๋ฉด ํ•ด๋‹น Operation ์˜ ์ถœ๋ ฅ๊ฐ’์„ return ํ•˜๋Š” ๊ฒƒ ๋„ ์•Œ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.(์•ˆ๋ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.)

@tf_export("constant", v1=[])
def constant(value, dtype=None, shape=None, name="Const"):
  
  # ...(์ƒ๋žต)
  
  g = ops.get_default_graph() 
  tensor_value = attr_value_pb2.AttrValue()
  tensor_value.tensor.CopyFrom(
      tensor_util.make_tensor_proto(
          value, dtype=dtype, shape=shape, verify_shape=verify_shape,
          allow_broadcast=allow_broadcast))
  dtype_value = attr_value_pb2.AttrValue(type=tensor_value.tensor.dtype)
  attrs = {"value": tensor_value, "dtype": dtype_value}
  const_tensor = g._create_op_internal(  # pylint: disable=protected-access
      "Const", [], [dtype_value.type], attrs=attrs, name=name).outputs[0]

  if op_callbacks.should_invoke_op_callbacks():
    callback_outputs = op_callbacks.invoke_op_callbacks(
        "Const", tuple(), attrs, (const_tensor,), op_name=name, graph=g)
    if callback_outputs is not None:
      const_tensor, = callback_outputs
  return const_tensor

์—ฌ๊ธฐ์„œ ์ฃผ์˜ ๊นŠ๊ฒŒ๋ด์•ผ ๋ด์•ผ ํ•  ์ฝ”๋“œ๋Š” ์•„๋ž˜ ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค.
ํŠนํžˆ tf.constant ํ•จ์ˆ˜ ๋‚ด์šฉ์ค‘ _create_op_internal์„ ์‚ดํŽด๋ด…์‹œ๋‹ค.
ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ดํŽด ๋ณด๋ฉด ์™ธ๋ถ€์— ๋ณด์ด์ง€ ์•Š์œผ๋ฉด์„œ ๋‚ด๋ถ€์ ์œผ๋กœ operation ์„ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  graph instance ์˜ method์ธ๊ฒƒ์„ ๋ณด์•„ graph ์— operation ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
single underscore ์ž„์œผ๋กœ ์™ธ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€์ง€ ์•Š์€ ํ•จ์ˆ˜์ž„์„ ์•Œ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ์ฆ‰ ํ…์„œํ”Œ๋กœ์šฐ๊ฐ€ operation ์ƒ์„ฑ์€ tensorflow ๊ฐ€ ์ œ๊ณตํ•˜๋Š” op.constructor ์„ ์‚ฌ์šฉํ•ด operation ์„ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ์„ ์˜๋„ํ•˜๊ณ  ์žˆ์Œ์„ ์‚ดํŽด ๋ณผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  const_tensor = g._create_op_internal(  # pylint: disable=protected-access
      "Const", [], [dtype_value.type], attrs=attrs, name=name).outputs[0]

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜(_create_op_internal)์˜ outputs ๋กœ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ tensor ๊ฐ€ ์ƒ์„ฑ๋จ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dataflow

์™œ Tensorflow ์„ Dataflow ๋ผ๊ณ  ํ• ๊นŒ์š”?
ํ•ด๋‹น ์‚ฌ์œ ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” tensor ๋ถ€๋ถ„์—์„œ data ์„ tensor๋กœ ํ‘œํ˜„ ํ•  ์ˆ˜ ์žˆ๋‚˜๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
์ฆ‰ ์ด๋œป์€ data ๊ฐ€ ํ๋ฅธ๋‹ค, Tensor ๊ฐ€ ํ๋ฅธ๋‹ค๋กœ ์ดํ•ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ์–ด๋””๋กœ ํ๋ฅผ๊นŒ? ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ operation ๊ณผ operation ์‚ฌ์ด๋ฅผ ํ๋ฅธ๋‹ค ๋ผ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
์ฆ‰ Tensorflow ๋Š” operation ๊ณผ operation ์‚ฌ์ด๋ฅผ tensor๊ฐ€ ํ๋ฅด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ํ๋ฅธ๋‹ค๋ผ๋Š” ๊ฐœ๋…์ด ๋ชจํ˜ธํ•˜๊ฒŒ ๋А๊ปด์งˆ์ˆ˜ ์žˆ๋Š”๋ฐ ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด์„œ ๋ณด๋‹ค ์ž์„ธํžˆ ์„ค๋ช… ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
Imgur
์œ„ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€๋ น tensor d ์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ–ˆ์„๋•Œ
tensor d ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด tensor a, b ์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๊ณ 
์ƒ์„ฑ๋œ tensor a, b๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด + operation ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Imgur

๋ฐ˜๋ฉด tensor d ๋ฅผ ์ƒ์„ฑํ•  ์‹œ ํ•„์š” ์—†๋Š” tensor c ๋Š” ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด ์ ์ด ๋ฐ”๋กœ tensorflow ์˜ dataflow ํŠน์ง•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
ํŠน์ • operation๋‚˜ tensor ์„ ์‹คํ–‰ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋…ธ๋“œ๋‚˜ ํ…์„œ๋“ค๋งŒ ์ˆ˜ํ–‰ ํ•œ๋‹ค๋Š” ์ ์ด์ฃ .
(โ– ๋ฌผ๋ก  ์ด ๊ฐœ๋…๋„ tensorflow 2.x ์˜ค๋ฉด์„œ graph ์„ ์ž‘๊ฒŒ ์ž‘๊ฒŒ ์ชผ๊ฐœ๋ฉด์„œ ํ•ด๋‹น ํŠน์ง•๋“ค์ด ์œ ์ €๋“ค์—๊ฒŒ ๋‘๋‘๋Ÿฌ์ ธ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. )

ํ•˜์ง€๋งŒ ๋‹จ์ˆœํ•œ graph ๊ฐœ๋…์—์„œ๋Š” ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์‚ฌ์ด์˜ ์ˆœ์„œ๋Š” ๊ฒฐ์ • ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์—ฐ๊ฒฐ ๋˜์–ด ์žˆ์„ ๋ฟ์ด์ฃ .
๊ทธ๋ž˜์„œ Tensorflow ์—์„œ๋Š” ์–ด๋–ค ๋…ธ๋“œ๊ฐ€ ๋จผ์ € ์‹คํ–‰ ๋˜์–ด์•ผ ํ•˜๋Š” dependnecy์„ ์ง€์ • ํ•ฉ๋‹ˆ๋‹ค.
(โ– ๋ฌผ๋ก  ์ด ๊ฐœ๋…๋„ tensorflow 2.x ์˜ค๋ฉด์„œ tensorflow ์ž์ฒด์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.)
์ง€์ •๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‹ค์Œ ๋…ธ๋“œ๋กœ tensor์„ ํ˜๋ ค์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ๊ณผ์ •๋“ค์„ ํ†ตํ•ด tensorflow๊ฐ€ ์ฐจ์šฉํ•˜๊ณ  ์žˆ๋Š” dataflow ๊ฐœ๋…์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ํ•ด๋‹น ๊ฐœ๋…์„ ํ†ตํ•ด ํ…์„œํ”Œ๋กœ์šฐ๋ฅผ ๋ณด๋‹ค ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Stateful

Stateful , Stateless ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ server-client ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด ์ž…๋‹ˆ๋‹ค.
Stateful ์ด๋ž€ ์„œ๋ฒ„๊ฐ€ client ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด์ฃ .
Tensorflow ๋Š” Graph ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Session ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
(๋„ค ๋งž์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต Web programming ์—์„œ client ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” cookie , session์—์„œ ๊ทธ session ๊ฐœ๋…๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.)
์ง€๊ธˆ์€ tensorflow 2.x ๋ฒ„์ „์ด ๋‚˜์˜ค๋ฉด์„œ session์˜ ๊ธฐ๋Šฅ์ด ๋’ค๋กœ ๊ฐ์ณ์กŒ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ•ด๋‹น ๊ฐœ๋…์„ ์ตํžˆ๋Š”๊ฒƒ์€ ํ…์„œํ”Œ๋กœ์šฐ๋ฅผ ๋ณด๋‹ค ๊นŠ๊ฒŒ ์กฐ๋งํ• ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ค„๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
tensorflow 1.x ๋ฒ„์ „์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ Tensorflow ์—์„œ stateful ์ด๋ผ๋Š” ๊ฐœ๋…์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํŒŒ์•…ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Graph ์ •์˜ ์‹œ์—๋Š” ์‹ค์ œ ๊ฐ’์ด ์ƒ์„ฑ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์–ด๋–ค Tensor๊ฐ€ ์–ด๋–ค Operation ์œผ๋กœ ํ˜๋Ÿฌ๊ฐˆ์ง€๋ฅผ ๊ฒฐ์ •ํ•  ๋ฟ์ด์ฃ .
Python ์€ Interpreter ์–ธ์–ด์ด๊ณ  ๋ฐ”๋กœ ๋ฐ”๋กœ ๊ฐ’๋“ค์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ Tensorflow 1.x ์ฝ”๋“œ๋Š” ๋ฐ”๋กœ๋ฐ”๋กœ ๊ฐ’์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
(ํ•ด๋‹น ํฌ์ŠคํŠธ์—์„œ๋Š” Tensorflow eager excution ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ 2๊ฐœ์˜ Random Variable(์ •๊ทœ ๋ถ„ํฌ)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‘๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ๊ฐ„๋‹จํ•œ Graph ์ž…๋‹ˆ๋‹ค.
์ด ๋•Œ Graph ์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ•ด์„œ ํ…์„œ(a, b, c)์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Imgur

a_init = tf.random.normal(shape=[])
a = tf.Variable(a_init)

b_init = tf.random.normal(shape=[])
a = tf.Variable(b_init)

c = tf.add(a, b)
print(a, b, c)

graph ์„ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์–ด๋–ค ํ…์„œ๊ฐ€ ์–ด๋–ค operation ์— ๋“ค์–ด๊ฐ€๊ณ  ์ถœ๋ ฅ๋˜๋Š”์ง€๋ฅผ ์ •์˜ ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ Graph ์˜ ๊ฐ ์š”์†Œ๋ฅผ ๊ตฌ๋™์‹œํ‚ค๊ณ  ๊ฐ’์„ ์–ป์–ด๋‚ผ๋ ค๋ฉด Graph๋ฅผ ์‹คํ–‰ํ•˜๋Š” Session ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ์ฝ”๋“œ์—์„œ Session ์„ instance ์„ ์ƒ์„ฑํ•˜๊ณ  tensor c ์„ ์‹คํ–‰ ์‹œ์ผœ ๋ด…๋‹ˆ๋‹ค. Imgur

์œ„์—์„œ ๋ณธ ๊ฒƒ ์ฒ˜๋Ÿผ Graph๊ฐ€ ์•„๋‹ˆ๋ผ Session์„ ํ†ตํ•ด Graph ์˜ ์‹ค์ œ ๊ฐ’๋“ค์„ ์‹คํ–‰ํ•˜๊ณ  Variable์˜ ์ƒํƒœ(state)๋ฅผ ์ €์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Tensorflow ๊ฐ€ stateful ํ•˜๋‹ค๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณ„์† ๋ณ€ํ™”ํ•˜๋Š” ๋ณ€์ˆ˜ ์ƒํƒœ์˜ ๊ฐ’์„ ์ €์žฅ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

# define graph 
a_init = tf.random.normal(shape=[])
a = tf.Variable(a_init)

b_init = tf.random.normal(shape=[])
a = tf.Variable(b_init)
c = tf.add(a, b)

# execute graph
sess = tf.Session()
sess.run(c)

์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉด ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์ด์ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ด์ ์ด ์žˆ๋Š”์ง€ ์‚ดํŽด ๋ด…๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ Graph์„ ์ƒ์„ฑํ•˜๊ณ  ์—ฌ๋Ÿฌ๊ฐœ์˜ Session ์„ ์ƒ์„ฑํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ด๋Š” ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์— ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ Web ์„œ๋น„์Šค์‹œ ๋ถ„์‚ฐ์ฒ˜๋ฆฌ์— ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ์Œ์„ ์•Œ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(์‹ค์ œ๋กœ Web programming ์—์„œ Web Framework(ex. django)๊ฐ€ WAS ์„œ๋ฒ„์—์„œ ์ž‘๋™๋˜๋Š” ์›๋ฆฌ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•Œ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ์˜ Session์„ ์‚ฌ์šฉํ•ด ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด ๋ด…๋‹ˆ๋‹ค.

Imgur

%tensorflow_version 1.x
import tensorflow as tf

# Define graph 
a_init = tf.random.normal(shape=[])
a = tf.Variable(a_init)

b_init = tf.random.normal(shape=[])
a = tf.Variable(b_init)
c = tf.add(a, b)


# Generate Multi Session 
sess1 = tf.Session()
print(sess1.run(c))

sess2 = tf.Session()
print(sess2.run(c))

sess3 = tf.Session()
print(sess3.run(c))

# >>> 1.3981419
# -0.042078532
# 0.48863256

์—ฌ๊ธฐ์„œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” Random Variable ์„ ํ†ตํ•ด ๊ฐ Session ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’๋“ค์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋“ค์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰ Session ์€ ์„œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ’๋“ค์„ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ๋“ค์„ ํ™•์ธํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฌ๋Ÿฌ ์œ ์ €์—๊ฒŒ ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต์ด ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•ด ์ง„๊ฒƒ๋“ค์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Sum up

ํ•ด๋‹น ํฌ์ŠคํŠธ๋ฅผ ํ†ตํ•ด Tensorflow ๊ฐ€ ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ๊ณ  ์–ด๋–ป๊ฒŒ ์ •์˜ ๋‚ด๋ฆด์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์‚ดํŽด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ tensorflow ์„ ์„ค๋ช…ํ•˜๋Š” ํ‚ค์›Œ๋“œ์ธ stateful graph dataflow์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ๋ณด๋‹ค ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค ๋ณด๋ฉด์„œ
tensorflow ์˜ ์„ค๊ณ„์™€ ์•„์ด๋””์–ด ๊ทธ๋ฆฌ๊ณ  ํ™œ์šฉ์„ ์‚ดํŽด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.