๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋จธ์‹ ๋Ÿฌ๋‹, ๋”ฅ๋Ÿฌ๋‹/OCR

TF Guide - Tensors ๊ณต๋ถ€

by ํ–‰๋ฑ 2019. 8. 19.

https://www.tensorflow.org/guide/tensors#shape

 

  • TF๋Š” ํ…์„œ์™€ ๊ด€๋ จ๋œ ์—ฐ์‚ฐ์„ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.
  • ํ…์„œ๋Š” ๊ณ ์ฐจ์› ๋ฒกํ„ฐ/ํ–‰๋ ฌ์˜ ์ผ๋ฐ˜ํ™”๋œ ๊ฐœ๋…์ด๋‹ค. (ํ…์„œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ base data type์˜ n์ฐจ์› ์–ด๋ ˆ์ด๋กœ ํ‘œํ˜„๋œ๋‹ค.)

 

  • TF ํ”„๋กœ๊ทธ๋žจ์„ ์งœ๋ฉด์„œ ๊ณ„์† ์กฐ์ž‘ํ•˜๊ณ  ๋„˜๊ฒจ์•ผ ํ•  ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋กœ tf.Tensor ์ธ๋ฐ, tf.Tensor๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ์ •์˜๋˜์—ˆ๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰์— ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์„ ๋งํ•œ๋‹ค.
  • TF ํ”„๋กœ๊ทธ๋žจ์€ 1) ๋จผ์ € tf.Tensor์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๋นŒ๋”ฉํ•˜๊ณ  2) ์–ด๋–ป๊ฒŒ ๊ฐ ํ…์„œ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ํ…์„œ์— ๊ธฐ๋ฐ˜ํ•ด ์—ฐ์‚ฐ๋˜๋Š”์ง€ ๋””ํ…Œ์ผ๋งํ•˜๊ณ  3) ์ด ๊ทธ๋ž˜ํ”„์˜ ์ผ๋ถ€๋ฅผ ์‹คํ–‰ํ•ด ์›ํ•˜๋Š” ๊ฐ’์„ ์–ป๋Š”๋‹ค.

 

  • tf.Tensor๋Š” ๋‘ ๊ฐ€์ง€ properties๋ฅผ ๊ฐ–๋Š”๋‹ค:
    • a data type (float32, int32, string ๋“ฑ)
    • a shape

 

  • ํ…์„œ์˜ ๊ฐ ์›์†Œ๋Š” ๊ฐ™์€ ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๊ฐ€์ง€๋ฉฐ data type์€ ์–ธ์ œ๋‚˜ ์•Œ๋ ค์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • shape์€ ํ…์„œ๊ฐ€ ๊ฐ€์ง€๋Š” ์ฐจ์›์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ ์ฐจ์›์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋งํ•˜๋ฉฐ, ์ผ๋ถ€๋งŒ ์•Œ๋ ค์ ธ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ธํ’‹์˜ shape์ด ์™„์ „ํžˆ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉด ๋Œ€๋ถ€๋ถ„ ์•„์›ƒํ’‹๋„ ์™„์ „ํžˆ ์•Œ๋ ค์ ธ ์žˆ์œผ๋‚˜, ๊ทธ๋ž˜ํ”„๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๊ฐ€ ๋˜์„œ์•ผ shape์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

 

  • ํ…์„œ ์ค‘ ํŠน๋ณ„ํ•œ ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค:
    • tf.Variable
    • tf.constant
    • tf.placeholder
    • tf.SparseTensor

 

  • tf.Variable ๋นผ๊ณ  ํ…์„œ์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ single execution tensors์˜ ๊ฒฝ์šฐ ์˜ค์ง ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๊ฐ–๋Š”๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜, ๊ฐ™์€ ํ…์„œ๋ฅผ ๋‘ ๋ฒˆ evaluating ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…์„œ๊ฐ€ ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๊ฑฐ๋‚˜ ๋‚œ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฐ๊ณผ๊ฐ’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

Rank

  • tf.Tensor์˜ rank๋Š” ์ฐจ์›์˜ ๊ฐœ์ˆ˜์ด๋‹ค. rank์˜ ์œ ์‚ฌ์–ด๋กœ๋Š” order, degree, n-dimension์ด ์žˆ๋‹ค.
  • TF์—์„œ์˜ rank๋Š” ์ˆ˜ํ•™์—์„œ์˜ matrix rank์™€๋Š” ๋‹ค๋ฅด๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด TF์˜ ๊ฐ rank๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ˆ˜ํ•™์  ์—”ํ‹ฐํ‹ฐ์™€ ๋Œ€์‘๋œ๋‹ค.
    • Rank 0: Scalar (magnitude only)
    • Rank 1: Vector (magnitude and direction)
    • Rank 2: Matrix (table of numbers)
    • Rank 3: 3-Tensor (cube of numbers)
    • Rank n: n-Tensor (you get the idea)

 

  • tf.rank ํ•จ์ˆ˜๋กœ tf.Tensor์˜ rank๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
my_image = tf.zeros([10, 299, 299, 3])  # batch x height x width x color

r = tf.rank(my_image)
# After the graph runs, r will hold the value 4.

 

  • tf.Tensor ๋‚ด ํ•˜๋‚˜์˜ ์…€์— ์ ‘๊ทผํ•˜๋ ค๋ฉด n indices๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.
my_matrix = tf.Variable([ [4, 9], [16, 25] ], tf.int32)

my_scalar = my_matrix[0, 1]
# shape=(), dtype=int32, numpy=9

my_row_vector = my_matrix[0]
# shape=(2,), dtype=int32, numpy=array([4, 9], dtype=int32)

my_column_vector = my_matrix[:, 1]
# shape=(2,), dtype=int32, numpy=array([ 9, 25], dtype=int32)

 

Shape

  • ํ…์„œ์˜ shape๋Š” ๊ฐ ์ฐจ์›์— ์›์†Œ๊ฐ€ ๋ช‡ ๊ฐœ๊ฐ€ ์žˆ๋Š๋ƒ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • TF๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ž๋™์œผ๋กœ shape๋ฅผ ์ถ”๋ก ํ•œ๋‹ค. ์ด ์ถ”๋ก ๋œ shape๋Š” rank๋ฅผ ์•Œ ์ˆ˜๋„, ๋ชจ๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. rank๋ฅผ ์•Œ์•„๋„ ๊ฐ ์ฐจ์›์˜ ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜๋„, ๋ชจ๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค.
  • TF ๋‹คํ๋จผํŠธ์—์„œ๋Š” 1) rank, 2) shape, 3) dimensional number ์„ธ ๊ฐ€์ง€์˜ notational convention์„ ์‚ฌ์šฉํ•œ๋‹ค.
Rank Shape Dimensional number Example
0 [] 0-D A 0-D tensor. A scalar.
1 [D0] 1-D A 1-D tensor with shape [5]
2 [D0, D1] 2-D A 2-D tensor with shape [3, 4]
3 [D0, D1, D2] 3-D A 3-D tensor with shape [1, 4, 3]
n [D0, D1, D2, ... Dn-1] n-D A tensor with shape [D0, D1, D2, ... Dn-1]

 

  • tf.Tensor์˜ shape์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
  • 1) tf.Tensor์˜ shape property์— ์ ‘๊ทผ
    • ๊ทธ๋ž˜ํ”„๋ฅผ ๋นŒ๋”ฉํ•  ๋•Œ ํ…์„œ์˜ shape์— ๋Œ€ํ•ด ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ธ์ง€ ๋ฌป๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด ๋•Œ ์ด ๋ฐฉ๋ฒ•์„ ์“ด๋‹ค.
    • ์ด ๋ฉ”์†Œ๋“œ๋Š” TensorShape ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, TensorShape ๊ฐ์ฒด๋Š” ์ผ๋ถ€๋งŒ ๋ช…์‹œ๋œ shape๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. (๊ทธ๋ž˜ํ”„๋ฅผ ๋นŒ๋”ฉํ•  ๋•Œ ๋ชจ๋“  shape๊ฐ€ ์™„์ „ํžˆ ์•Œ๋ ค์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ)

 

  • 2) tf.shape operation
    • tf.Tensor์˜ ์™„์ „ํžˆ ์•Œ๋ ค์ง„ shape๋ฅผ runtime์— ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
    • ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ํ…์„œ์˜ shape๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๋นŒ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค. shape ์กฐ์ž‘์€ ์ธํ’‹ tf.Tensor์˜ dynamic shape์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ํ…์„œ๋ฅผ ๋นŒ๋”ฉํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

  • tf.Tensor์˜ shape ๋ณ€๊ฒฝ
    • ํ…์„œ์˜ ์›์†Œ ๊ฐœ์ˆ˜๋Š” shape ์‚ฌ์ด์ฆˆ์˜ ๊ณฑ๊ณผ ๊ฐ™๋‹ค.
    • scalar์˜ ์›์†Œ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ 1์ด๋‹ค.
    • ๊ฐ™์€ ์›์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ–๋Š” ์„œ๋กœ ๋‹ค๋ฅธ shape๋Š” ๋งŽ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์›์†Œ๋Š” ์œ ์ง€ํ•˜๋ฉด์„œ shape๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • https://www.tensorflow.org/guide/tensors#getting_a_tftensor_objects_shape

 

Data types

  • ์ฐจ์›๊ณผ ๋”๋ถˆ์–ด ํ…์„œ๋Š” data type์„ ๊ฐ€์ง„๋‹ค. data type ๋ฆฌ์ŠคํŠธ๋Š” ์—ฌ๊ธฐ์„œ ์ฐธ๊ณ .
  • tf.Tensor๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ data type์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž„์˜์˜ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ strings๋กœ serialize ํ•˜๊ณ  tf.Tensors๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • tf.Tensor์˜ data type์„ ํ™•์ธํ•˜๋ ค๋ฉด Tensor.dtype property๋ฅผ ์ด์šฉํ•˜๋ผ.

 

  • tf.cast๋ฅผ ์ด์šฉํ•ด tf.Tensor์˜ data type์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

 

  • ํŒŒ์ด์ฌ ๊ฐ์ฒด๋กœ tf.Tensor๋ฅผ ๋งŒ๋“ค ๋•Œ data type์„ ์„ ํƒ์ ์œผ๋กœ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด TF๋Š” ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” data type์„ ์„ ํƒํ•œ๋‹ค. TF๋Š” ํŒŒ์ด์ฌ integer๋ฅผ tf.int32๋กœ, ํŒŒ์ด์ฌ floating point๋ฅผ tf.float32๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. 
  • ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด TF๋Š” ์–ด๋ ˆ์ด๋ฅผ ๋ณ€ํ™˜ํ•  ๋Œ€ numpy๊ฐ€ ์“ฐ๋Š” ๋ฃฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

Evaluating Tensors

  • ์ผ๋‹จ ์—ฐ์‚ฐ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋นŒ๋”ฉ๋˜๋ฉด, ํŠน๋ณ„ํ•œ tf.Tensor๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ํ• ๋‹น๋  ๊ฐ’์„ fetchํ•˜๋Š”, ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฑด ๋””๋ฒ„๊น…์—์„œ๋„ ์œ ์šฉํ•˜๋‹ค.
  • Tensor.eval ๋ฉ”์†Œ๋“œ๋กœ ํ…์„œ๋ฅผ evaluating ํ•  ์ˆ˜ ์žˆ๋‹ค. eval์€ default tf.Session์ด activeํ•  ๋•Œ๋งŒ ์ž‘๋™ํ•œ๋‹ค. eval์€ ๊ทธ ํ…์„œ์™€ ๊ฐ™์€ contents๋ฅผ ๊ฐ€์ง€๋Š” numpy ์–ด๋ ˆ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • context๊ฐ€ ์—†๋Š” ์ƒํƒœ์—์„œ tf.Tensor๋ฅผ evaluating ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ๋„ ์žˆ๋‹ค. ๊ทธ ๊ฐ’์ด ์•„์ง unavailableํ•œ dynamic information์— ์˜์กดํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด placeholder์— ์˜์กดํ•˜๋Š” ํ…์„œ๋Š” placeholder์— ์ค„ ๊ฐ’์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด evaluating ํ•  ์ˆ˜ ์—†๋‹ค.
    • placeholder ๋ฟ ์•„๋‹ˆ๋ผ ์–ด๋–ค tf.Tensor๋ผ๋„ feedํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • TF๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€๋‚˜ control flow constructs ๋‚ด๋ถ€์—์„œ ์ •์˜๋œ tf.Tensor๋Š” ๋ฐ”๋กœ evaluating ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ๋งŒ์•ฝ tf.Tensor๊ฐ€ ํ์˜ ๊ฐ’์— ์˜์กดใ„ดํ•œ๋‹ค๋ฉด, tf.Tensor๋ฅผ evaluating ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ค ๊ฒƒ์ด ์ธํ๋œ ๋‹ค์Œ์—์„œ์•ผ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ๋กœ ์ž‘์—…ํ•  ๋•Œ๋Š” tf.Tensor๋ฅผ evaluating ํ•˜๊ธฐ ์ „์— tf.train.start_queue_runners๋ฅผ ํ˜ธ์ถœํ•˜๋ผ.

 

Printing Tensors

  • ๋””๋ฒ„๊น… ๋ชฉ์ ์œผ๋กœ tf.Tensor์˜ ๊ฐ’์„ ํ”„๋ฆฐํŠธํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ˆœํžˆ print(tensor) ์ฒ˜๋Ÿผ์€ ์ž˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
    • ์ด ์ฝ”๋“œ๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ๋นŒ๋”ฉ๋˜์—ˆ์„ ๋•Œ์˜ symbolic tensor๋ฅผ ํ”„๋ฆฐํŠธํ•œ๋‹ค. ์ด ํ…์„œ๋Š” ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค.
    • ์ด ์ฝ”๋“œ๋Š” ๋ฏธ๋ค„์ง„ ์—ฐ์‚ฐ์„ ํ‘œํ˜„ํ•˜๋Š” tf.Tensor ๊ฐ์ฒด๋ฅผ ํ”„๋ฆฐํŠธํ•œ๋‹ค. (๊ฐ’์ด ์•„๋‹ˆ๋ผ)
  • ๋Œ€์‹  TF๋Š” tf.Print operation์„ ์ œ๊ณตํ•œ๋‹ค.
    • tf.Print๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ tf.Tensor์˜ ์„ธํŠธ๋ฅผ ํ”„๋ฆฐํŠธํ•˜๋Š” ๋™์•ˆ, ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ฒซ ์ธ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋Œ“๊ธ€