Tensorflow๋ž€?

๊ตฌ๊ธ€์—์„œ ๋งŒ๋“  ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ˆ˜์น˜์  ๊ณ„์‚ฐ์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

Data Flow Graph๋ž€?

Edge : Data / Data Array / Tensor

Node : Operator

์ด ๊ทธ๋ž˜ํ”„ ์†์—์„œ Tensor๋“ค์˜ ํ๋ฆ„์œผ๋กœ ๊ณ„์‚ฐ์„ ์ง„ํ–‰ โ†’ Tensorflow

Tensorflow Hello World

version ํ™•์ธ

import tensorflow as tf
tf.__version__
# Create a constant op
# ๊ทธ๋ž˜ํ”„์— ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ
hello = tf.constant("Hello, TensorFlow!")
 
# ์„ธ์…˜์„ ๋งŒ๋“ฆ
sess = tf.Session()
 
# run the op and get result
print(sess.run(hello))
b'Hello, TensorFlow!'

Computational Graph

  1. ํ•„์š”ํ•œ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0) # also tf.float32 implicitly
node3 = tf.add(node1, node2)
  1. ๊ฐ๊ฐ์„ ์ถœ๋ ฅํ•ด๋ณด์ž.
print("node1:", node1, "node2:", node2)
print("node3: ", node3)
node1: Tensor("Const_1:0", shape=(), dtype=float32) node2: Tensor("Const_2:0", shape=(), dtype=float32)
node3:  Tensor("Add:0", shape=(), dtype=float32)

๊ฐ๊ฐ์˜ ๊ฐ’์€ ํ…์„œ ๊ฐ์ฒด๋กœ ์„ ์–ธ์ด ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ์ž๋ฅผ ์ฐ์–ด๋ณด๋ฉด ํ…์„œ๋ผ๋Š” ์ •๋ณด ๋ฐ–์— ์•ˆ ์ฐํžˆ๋Š”๊ฒŒ ๋‹น์—ฐํ•˜๋‹ค.

  1. ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚˜์˜ค๊ฒŒ ํ•˜๋ ค๋ฉด, ์„ธ์…˜์„ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•œ๋‹ค!
sess = tf.Session()
print("sess.run(node1, node2): ", sess.run([node1, node2]))
print("sess.run(node3): ", sess.run(node3))

constant ๋…ธ๋“œ๋Š” ๊ทธ๋ƒฅ ๊ฐ’์ด ์ฐํžˆ๊ณ ,

operation node๋Š” ์—ฐ์‚ฐ ์ˆ˜ํ–‰ํ›„ ๊ฒฐ๊ณผ๊ฐ’์ด ์ฐํžŒ๋‹ค.

ํ…์„œํ”Œ๋กœ์šฐ์˜ ๋™์ž‘๊ณผ์ •

  1. ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฐ๋‹ค.
  2. ๊ฐ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ ์‹œํ‚จ๋‹ค.
  3. ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

Placeholder ๋ž€?

์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ,

์œ„์—์„œ ์‚ฌ์šฉํ•œ constant ์ฒ˜๋Ÿผ ๊ฐ’์ด ๊ณ ์ •๋˜์–ด์„œ ์‚ฌ์šฉ๋˜๋Š” ์ผ ๋ณด๋‹ค๋Š” ๊ณ„์† ํ•ด์„œ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋…€์„์„

๊ฐ€์ง€๊ณ ์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ผ์ด ๋งŽ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํ•™์Šตํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์ „์ฒด์ ์œผ๋กœ ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๋Š” ๊ณผ์ •์—์„œ ์ƒ๊ธฐ๋Š”

์—ฐ์‚ฐ๊ณผ์ •, ์ฆ‰ ๊ทธ๋ž˜ํ”„๋Š” ๋™์ผํ•˜์ง€๋งŒ

์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐ์ดํ„ฐ ๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ๋Š” ์–ด๋–ค ์ž๋ฃŒํ˜•(๊ฐ์ฒด)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ ๊นŒ?

ํ…์„œํ”Œ๋กœ์šฐ์—์„œ๋Š” placeholder ๋ผ๋Š” ๊ฐœ๋…์„ ์ฐจ์šฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b  # + provides a shortcut for tf.add(a, b)
 
print(sess.run(adder_node, feed_dict={a: 3, b: 4.5}))
print(sess.run(adder_node, feed_dict={a: [1,3], b: [2, 4]}))

a ๋…ธ๋“œ์™€ b๋…ธ๋“œ๋Š” placeholder ๋…ธ๋“œ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‘ ๋…ธ๋“œ๋ฅผ ๋”ํ•˜๋ผ๋Š” ๋…ธ๋“œ๋ฅผ adder_node ๋ผ ์„ ์–ธํ–ˆ๋‹ค.

(์ด ๋•Œ, tf.add(a, b)๋ฅผ + ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ๋‘์—ˆ๋‹ค.)

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์šฐ๋ฆฌ๊ฐ€ adder_node ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด,

adder_node ๋Š” ์ž๊ธฐ๊ฐ€ ์–ด๋–ค ๋…ธ๋“œ๋ฅผ ๋ฐ›์•„ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ง€ ๋ชจ๋ฅธ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์ด ๋…ธ๋“œ์— ๋ฐฅ(feed) ๋ฅผ ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ,

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ feed_dict ์ด๋‹ค.

7.5
[ 3.  7.]

Array ๋กœ ๋„ฃ์–ด์ค„ ๊ฒฝ์šฐ, ๊ฐ๊ฐ์„ ๋ณ‘๋ ฌ๋กœ ๊ณ„์‚ฐํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚ด๋†“๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

What is Tensor

ํ…์„œ๋Š” 3์ฐจ์› ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ์—ฌ์žˆ๋Š” ๊ฑธ์„ ์นญํ•œ๋‹ค.

ํ–‰๋ ฌ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” 2์ฐจ์›์˜ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์ฐจ์›์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์šฐ๋ฆฌ๋Š” Rank ๋ผ ํ•œ๋‹ค.

์‹ค์ œ ์„ ํ˜• ๋Œ€์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฐจ์›์˜ ๊ฐœ๋…๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค.

์ด ๋•Œ, ํ–‰๋ ฌ๋„ ํ–‰๊ณผ ์—ด์˜ ๊ธธ์ด์— ๋”ฐ๋ผ ๋ชจ์–‘์ด ๋ณ€ํ™”ํ•œ๋‹ค.

๊ฐ™์€ ์›๋ฆฌ๋กœ ํ…์„œ๋„ ๊ทธ ๋ชจ์–‘์ด ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ Shape ์ด๋ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ๊ฐ node์— ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ๋•Œ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์ง€๋Š” ์ž๋ฃŒํ˜•์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ…์„œํ”Œ๋กœ์šฐ์—์„œ๋Š”, int32, float32โ€ฆ ๊ฐ™์€ ์ž๋ฃŒํ˜•์ด ์กด์žฌํ•œ๋‹ค.

์ด๊ฒƒ์„ Type ์ด๋ผํ•œ๋‹ค.

Reference