[API] Tensorflow Convert to Tensor - Shape and Shaping

(텐서플로우 텐서 변환 - 구조 및 구조 변형)



구조(Shape) 및 구조 변형(Shaping)

TensorFlow는 텐서의 구조(shape)를 확인하거나 구조를 변형하는 데 사용할 수 있는 몇 가지 함수를 제공합니다.


tf.shape(input, name=None)


텐서의 구조(shape)를 반환합니다.


이 함수는 input 텐서의 구조(shape)를 1-D 정수형 텐서로 반환합니다.


예시:

# 't'는 [[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]]

shape(t) ==> [2, 2, 3]

인자:
  • inputTensor.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

int32형 Tensor.


출처: 텐서 변환


Tensorflow tf.tf.shape 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

In [3]: const1 = tf.constant(1)

In [4]: tfutil.print_constant(const1)

1

In [5]: print(const1)

Tensor("Const:0", shape=(), dtype=int32)

In [6]: tfutil.print_operation_value(tf.shape(const1))

[]

In [7]: const2 = tf.constant([12])

In [8]: tfutil.print_constant(const2)

[1 2]

In [9]: print(const2)

Tensor("Const_1:0", shape=(2,), dtype=int32)

In [10]: tfutil.print_operation_value(tf.shape(const2))

[2]

In [11]: const3 = tf.constant([[12], [34]])

In [12]: tfutil.print_constant(const3)

[[1 2]

 [3 4]]

In [13]: print(const3)

Tensor("Const_2:0", shape=(2, 2), dtype=int32)

In [14]: tfutil.print_operation_value(tf.shape(const3))

[2 2]

In [15]: const3 = tf.constant([[12], [34], [56]])

In [16]: tfutil.print_constant(const3)

[[1 2]

 [3 4]

 [5 6]]

In [17]: print(const3)

Tensor("Const_3:0", shape=(3, 2), dtype=int32)

In [18]: tfutil.print_operation_value(tf.shape(const3))

[3 2]

In [19]: const5 = tf.constant([[[1], [2]], [[3], [4]]])

In [20]: tfutil.print_constant(const5)

[[[1]

  [2]]

 [[3]

  [4]]]

In [21]: print(const5)

Tensor("Const_4:0", shape=(2, 2, 1), dtype=int32)

In [22]: tfutil.print_operation_value(tf.shape(const5))

[2 2 1]

In [23]: const6 = tf.constant([[[1], [2]], [[3], [4]], [[5], [6]]])

In [24]: tfutil.print_constant(const6)

[[[1]

  [2]]

 [[3]

  [4]]

 [[5]

  [6]]]

In [25]: print(const6)

Tensor("Const_5:0", shape=(3, 2, 1), dtype=int32)

In [26]: tfutil.print_operation_value(tf.shape(const6))

[3 2 1]


tf.shape_n(input, name=None)


텐서의 구조(shape)를 반환합니다.


이 함수는 input[i]들의 구조를 나타내는 N개의 1-D 정수 텐서를 반환합니다.

인자:
  • input: 같은 자료형의 1개 이상의 Tensor의 리스트.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

input의 텐서와 같은 개수의 int32형 Tensor의 리스트.


출처: 텐서 변환


Tensorflow tf.shape_n 결과

In [1]:

import tensorflow as tf

import numpy as np

import tfutil

In [2]:

= [1]

const1 = tf.constant(np.array(x))

print(const1)

print(tf.shape(const1))

tfutil.print_constant(const1)

Tensor("Const:0", shape=(1,), dtype=int64)

Tensor("Shape:0", shape=(1,), dtype=int32)

[1]

In [3]:

sn_const1 = tf.shape_n([const1])

print(sn_const1)

tfutil.print_operation_value(sn_const1)

[<tf.Tensor 'ShapeN:0' shape=(1,) dtype=int32>]

[array([1], dtype=int32)]

In [4]:

= [12]

const2 = tf.constant(np.array(x))

print(const2)

print(tf.shape(const2))

tfutil.print_constant(const2)

Tensor("Const_1:0", shape=(2,), dtype=int64)

Tensor("Shape_1:0", shape=(1,), dtype=int32)

[1 2]

In [5]:

sn_const2 = tf.shape_n([const2])

print(sn_const2)

tfutil.print_operation_value(sn_const2)

[<tf.Tensor 'ShapeN_1:0' shape=(1,) dtype=int32>]

[array([2], dtype=int32)]

In [6]:

= [[12], [34]]

const3 = tf.constant(np.array(x))

print(const3)

print(tf.shape(const3))

tfutil.print_constant(const3)

Tensor("Const_2:0", shape=(2, 2), dtype=int64)

Tensor("Shape_2:0", shape=(2,), dtype=int32)

[[1 2]

 [3 4]]

In [7]:

sn_const3 = tf.shape_n([const3])

print(sn_const3)

tfutil.print_operation_value(sn_const3)

[<tf.Tensor 'ShapeN_2:0' shape=(2,) dtype=int32>]

[array([2, 2], dtype=int32)]

In [8]:

= [[12], [34], [56]]

const4 = tf.constant(np.array(x))

print(const4)

print(tf.shape(const4))

tfutil.print_constant(const4)

Tensor("Const_3:0", shape=(3, 2), dtype=int64)

Tensor("Shape_3:0", shape=(2,), dtype=int32)

[[1 2]

 [3 4]

 [5 6]]

In [9]:

sn_const4 = tf.shape_n([const4])

print(sn_const4)

tfutil.print_operation_value(sn_const4)

[<tf.Tensor 'ShapeN_3:0' shape=(2,) dtype=int32>]

[array([3, 2], dtype=int32)]

In [10]:

= [[[1], [2]], [[3], [4]]]

const5 = tf.constant(np.array(x))

print(const5)

print(tf.shape(const5))

tfutil.print_constant(const5)

Tensor("Const_4:0", shape=(2, 2, 1), dtype=int64)

Tensor("Shape_4:0", shape=(3,), dtype=int32)

[[[1]

  [2]]

 [[3]

  [4]]]

In [11]:

sn_const5 = tf.shape_n([const5])

print(sn_const5)

tfutil.print_operation_value(sn_const5)

[<tf.Tensor 'ShapeN_4:0' shape=(3,) dtype=int32>]

[array([2, 2, 1], dtype=int32)]

In [12]:

= [[[1], [2]], [[3], [4]], [[5], [6]]]

const6 = tf.constant(np.array(x))

print(const6)

print(tf.shape(const6))

tfutil.print_constant(const6)

Tensor("Const_5:0", shape=(3, 2, 1), dtype=int64)

Tensor("Shape_5:0", shape=(3,), dtype=int32)

[[[1]

  [2]]

 [[3]

  [4]]

 [[5]

  [6]]]

In [13]:

sn_const6 = tf.shape_n([const6])

print(sn_const6)

tfutil.print_operation_value(sn_const6)

[<tf.Tensor 'ShapeN_5:0' shape=(3,) dtype=int32>]

[array([3, 2, 1], dtype=int32)]

In [14]:

sn_const6 = tf.shape_n([[const6]])

print(sn_const6)

tfutil.print_operation_value(sn_const6)

[<tf.Tensor 'ShapeN_6:0' shape=(4,) dtype=int32>]

[array([1, 3, 2, 1], dtype=int32)]


tf.size(input, name=None)


텐서의 크기(size)를 반환합니다.


이 함수는 input 텐서의 원소의 수를 정수로 반환합니다.


예시:

# 't'는 [[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]]]

size(t) ==> 12

인자:
  • inputTensor.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

int32형 Tensor.


출처: 텐서 변환


Tensorflow tf.size 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

In [3]: const1 = tf.constant(1)

In [4]: tfutil.print_constant(const1)

1

In [5]: print(const1)

Tensor("Const:0", shape=(), dtype=int32)

In [6]: tfutil.print_operation_value(tf.size(const1))

1

In [7]: const2 = tf.constant([12])

In [8]: tfutil.print_constant(const2)

[1 2]

In [9]: print(const2)

Tensor("Const_1:0", shape=(2,), dtype=int32)

In [10]: tfutil.print_operation_value(tf.size(const2))

2

In [11]: const3 = tf.constant([[12], [34]])

In [12]: tfutil.print_constant(const3)

[[1 2]

 [3 4]]

In [13]: print(const3)

Tensor("Const_2:0", shape=(2, 2), dtype=int32)

In [14]: tfutil.print_operation_value(tf.size(const3))

4

In [15]: const4 = tf.constant([[12], [34], [56]])

In [16]: tfutil.print_constant(const4)

[[1 2]

 [3 4]

 [5 6]]

In [17]: print(const4)

Tensor("Const_3:0", shape=(3, 2), dtype=int32)

In [18]: tfutil.print_operation_value(tf.size(const4))

6

In [19]: const5 = tf.constant([[[1], [2]], [[3], [4]]])

In [20]: tfutil.print_constant(const5)

[[[1]

  [2]]

 [[3]

  [4]]]

In [21]: print(const5)

Tensor("Const_4:0", shape=(2, 2, 1), dtype=int32)

In [22]: tfutil.print_operation_value(tf.size(const5))

4

In [23]: const6 = tf.constant([[[1], [2]], [[3], [4]], [[5], [6]]])

In [24]: tfutil.print_constant(const6)

[[[1]

  [2]]

 [[3]

  [4]]

 [[5]

  [6]]]

In [25]: print(const6)

Tensor("Const_5:0", shape=(3, 2, 1), dtype=int32)

In [26]: tfutil.print_operation_value(tf.size(const6))

6


tf.rank(input, name=None) 


텐서의 랭크(rank)를 반환합니다.


이 함수는  input  텐서의 랭크를 정수로 반환합니다.


예시:

# 't' is [[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]]

# shape of tensor 't' is [2, 2, 3]

rank(t) ==> 3


참고: 텐서의 랭크는 행렬의 랭크와는 다른 개념입니다. 텐서의 랭크는 텐서의 각 원소를 선택하기 위해 필요한 인덱스의 수입니다. 랭크는 order, degree, ndims 등으로 부르기도 합니다.


인자:

• input :  Tensor  또는  SparseTensor .

• name : 오퍼레이션의 명칭. (선택사항)


반환값:


 int32 형  Tensor .


출처: 텐서 변환


Tensorflow tf.rank 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

In [3]: const1 = tf.constant(1)

In [4]: tfutil.print_constant(const1)

1

In [5]: print(const1)

Tensor("Const:0", shape=(), dtype=int32)

In [6]: tfutil.print_operation_value(tf.rank(const1))

0

In [7]: const2 = tf.constant([12])

In [8]: tfutil.print_constant(const2)

[1 2]

In [9]: print(const2)

Tensor("Const_1:0", shape=(2,), dtype=int32)

In [10]: tfutil.print_operation_value(tf.rank(const2))

1

In [11]: const3 = tf.constant([[12], [34]])

In [12]: tfutil.print_constant(const3)

[[1 2]

 [3 4]]

In [13]: print(const3)

Tensor("Const_2:0", shape=(2, 2), dtype=int32)

In [14]: tfutil.print_operation_value(tf.rank(const3))

2

In [15]: const4 = tf.constant([[12], [34], [56]])

In [16]: tfutil.print_constant(const4)

[[1 2]

 [3 4]

 [5 6]]

In [17]: print(const4)

Tensor("Const_3:0", shape=(3, 2), dtype=int32)

In [18]: tfutil.print_operation_value(tf.rank(const4))

2

In [19]: const5 = tf.constant([[[1], [2]], [[3], [4]]])

In [20]: tfutil.print_constant(const5)

[[[1]

  [2]]

 [[3]

  [4]]]

In [21]: print(const5)

Tensor("Const_4:0", shape=(2, 2, 1), dtype=int32)

In [22]: tfutil.print_operation_value(tf.rank(const5))

3

In [23]: const6 = tf.constant([[[1], [2]], [[3], [4]], [[5], [6]]])

In [24]: tfutil.print_constant(const6)

[[[1]

  [2]]

 [[3]

  [4]]

 [[5]

  [6]]]

In [25]: print(const6)

Tensor("Const_5:0", shape=(3, 2, 1), dtype=int32)

In [26]: tfutil.print_operation_value(tf.rank(const6))

3


tf.reshape(tensor, shape, name=None)


텐서의 구조를 변형합니다.


tensor가 주어졌을 때, 이 함수는 해당 텐서와 같은 원소들을 가지며 구조가 shape인 텐서를 반환합니다.


만약 shape의 한 원소가 -1이라면, 전체 크기가 일정하게 유지되도록 해당 차원의 길이가 자동으로 계산됩니다. 특별히, shape가 [-1]이라면, 텐서는 1-D로 펴지게 됩니다. shape에서 최대 한 개의 원소만 -1이 될 수 있습니다.


만약 shape가 1-D이거나 그 이상이라면, 오퍼레이션은 tensor의 원소로 shape의 구조가 채워진 텐서를 반환합니다. 이 경우, shape에 의해 지정된 원소의 전체 수는 tensor의 원소의 전체 수와 동일해야 합니다.


예시:

# tensor 't'는 [1, 2, 3, 4, 5, 6, 7, 8, 9]

# tensor 't'의 구조(shape)는 [9]

reshape(t, [3, 3]) ==> [[1, 2, 3],

                        [4, 5, 6],

                        [7, 8, 9]]


# tensor 't'는 [[[1, 1], [2, 2]],

#               [[3, 3], [4, 4]]]

# tensor 't'의 구조(shape)는 [2, 2, 2]

reshape(t, [2, 4]) ==> [[1, 1, 2, 2],

                        [3, 3, 4, 4]]


# tensor 't'는 [[[1, 1, 1],

#                [2, 2, 2]],

#               [[3, 3, 3],

#                [4, 4, 4]],

#               [[5, 5, 5],

#                [6, 6, 6]]]

# tensor 't'의 구조(shape)는 [3, 2, 3]

# shape를 '[-1]'로 하여 't'를 1-D로 펴기

reshape(t, [-1]) ==> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]


# 구조를 암시(infer)하기 위한 -1의 사용


# -1은 9를 의미:

reshape(t, [2, -1]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],

                         [4, 4, 4, 5, 5, 5, 6, 6, 6]]

# -1은 2를 의미:

reshape(t, [-1, 9]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],

                         [4, 4, 4, 5, 5, 5, 6, 6, 6]]

# -1은 3을 의미:

reshape(t, [ 2, -1, 3]) ==> [[[1, 1, 1],

                              [2, 2, 2],

                              [3, 3, 3]],

                             [[4, 4, 4],

                              [5, 5, 5],

                              [6, 6, 6]]]


# tensor 't'는 [7]

# shape를 `[]`로 하면 스칼라(scalar)로 구조 변환

reshape(t, []) ==> 7

인자:
  • tensorTensor.
  • shapeint32형 Tensor. 출력 텐서의 구조(shape) 지정.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

tensor와 같은 자료형의 Tensor.


출처: 텐서 변환


Tensorflow tf.reshape 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

In [3]: const1 = tf.constant([123456789])

In [4]: print(const1)

Tensor("Const:0", shape=(9,), dtype=int32)

In [5]: tfutil.print_constant(const1)

[1 2 3 4 5 6 7 8 9]

In [6]: rs_const1 = tf.reshape(const1, [33])

In [7]: print(rs_const1)

Tensor("Reshape:0", shape=(3, 3), dtype=int32)

In [8]: tfutil.print_operation_value(rs_const1)

[[1 2 3]

 [4 5 6]

 [7 8 9]]

In [9]: const2 = tf.constant([[[11], [22]], [[33], [44]]])

In [10]: print(const2)

Tensor("Const_1:0", shape=(2, 2, 2), dtype=int32)

In [11]: tfutil.print_constant(const2)

[[[1 1]

  [2 2]]

 [[3 3]

  [4 4]]]

In [12]: rs_const2 = tf.reshape(const2, [24])

In [13]: print(rs_const2)

Tensor("Reshape_1:0", shape=(2, 4), dtype=int32)

In [14]: tfutil.print_operation_value(rs_const2)

[[1 1 2 2]

 [3 3 4 4]]

In [15]: const3 = tf.constant([[[111], [222]], [[333], [444]], [[555], [666]]])

In [16]: print(const3)

Tensor("Const_2:0", shape=(3, 2, 3), dtype=int32)

In [17]: tfutil.print_constant(const3)

[[[1 1 1]

  [2 2 2]]

 [[3 3 3]

  [4 4 4]]

 [[5 5 5]

  [6 6 6]]]

In [18]: rs_const3 = tf.reshape(const3, [-1])

In [19]: print(rs_const3)

Tensor("Reshape_2:0", shape=(18,), dtype=int32)

In [20]: tfutil.print_operation_value(rs_const3)

[1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6]

In [21]: const4 = tf.constant([111222333444555666])

In [22]: print(const4)

Tensor("Const_3:0", shape=(18,), dtype=int32)

In [23]: tfutil.print_constant(const4)

[1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6]

In [24]: rs_const4 = tf.reshape(const4, [2-1])

In [25]: print(rs_const4)

Tensor("Reshape_3:0", shape=(2, 9), dtype=int32)

In [26]: tfutil.print_operation_value(rs_const4)

[[1 1 1 2 2 2 3 3 3]

 [4 4 4 5 5 5 6 6 6]]

In [27]: const5 = tf.constant([[111222333], [444555666]])

In [28]: print(const5)

Tensor("Const_4:0", shape=(2, 9), dtype=int32)

In [29]: tfutil.print_constant(const5)

[[1 1 1 2 2 2 3 3 3]

 [4 4 4 5 5 5 6 6 6]]

In [30]: rs_const5 = tf.reshape(const5, [2-13])

In [31]: print(rs_const5)

Tensor("Reshape_4:0", shape=(2, 3, 3), dtype=int32)

In [32]: tfutil.print_operation_value(rs_const5)

[[[1 1 1]

  [2 2 2]

  [3 3 3]]

 [[4 4 4]

  [5 5 5]

  [6 6 6]]]

In [33]: const6 = tf.constant([7])

In [34]: print(const6)

Tensor("Const_5:0", shape=(1,), dtype=int32)

In [35]: tfutil.print_constant(const6)

[7]

In [36]: rs_const6 = tf.reshape(const6, [])

In [37]: print(rs_const6)

Tensor("Reshape_5:0", shape=(), dtype=int32)

In [38]: tfutil.print_operation_value(rs_const6)

7


tf.squeeze(input, squeeze_dims=None, name=None)


텐서에서 크기 1인 차원을 제거합니다.


input 텐서가 주어졌을 때, 이 함수는 그와 같은 자료형의 크기 1인 차원이 모두 제거된 텐서를 반환합니다. 만약 모든 크기 1인 차원을 제거하고 싶은 것이 아니라면, 제거하고 싶은 특정한 크기 1인 차원들을 squeeze_dims으로 지정할 수 있습니다.


예시:

# 't'는 구조(shape) [1, 2, 1, 3, 1, 1]의 텐서

shape(squeeze(t)) ==> [2, 3]


제거할 크기 1인 차원들을 squeeze_dims으로 지정하기:

# 't'는 구조(shape) [1, 2, 1, 3, 1, 1]의 텐서
shape(squeeze(t, [2, 4])) ==> [1, 2, 3, 1]
인자:
  • inputTensor.
  • squeeze_dimsint의 리스트. 기본값은 []. 지정된 경우, 리스트 안의 차원만 제거합니다. 크기가 1이 아닌 차원을 제거하는 것은 오류입니다. (선택사항)
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

input과 같은 자료형의 Tensorinput과 같은 원소를 포함하지만, 하나 이상의 크기 1인 차원이 제거되어 있습니다.


출처: 텐서 변환


Tensorflow tf.squeeze 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

In [3]: # [1, 2, 1, 3, 1, 1]

In [4]: const1 = tf.constant([[ [[ [[1]], [[2]], [[3]] ]], [[ [[4]], [[5]], [[6]] ]] ]])

In [5]: print(const1)

Tensor("Const:0", shape=(1, 2, 1, 3, 1, 1), dtype=int32)

In [6]: print(tf.shape(const1))

Tensor("Shape:0", shape=(6,), dtype=int32)

In [7]: tfutil.print_constant(const1)

[[[[[[1]]

    [[2]]

    [[3]]]]

  [[[[4]]

    [[5]]

    [[6]]]]]]

In [8]: sq_const1 = tf.squeeze(const1)

In [9]: print(sq_const1)

Tensor("Squeeze:0", shape=(2, 3), dtype=int32)

In [10]: print(tf.shape(sq_const1))

Tensor("Shape_1:0", shape=(2,), dtype=int32)

In [11]: tfutil.print_operation_value(sq_const1)

[[1 2 3]

 [4 5 6]]

In [12]: # [1, 2, 1, 3, 1, 1]

In [13]: const2 = tf.constant([[ [[ [[1]], [[2]], [[3]] ]], [[ [[4]], [[5]], [[6]] ]] ]])

In [14]: print(const2)

Tensor("Const_1:0", shape=(1, 2, 1, 3, 1, 1), dtype=int32)

In [15]: print(tf.shape(const2))

Tensor("Shape_2:0", shape=(6,), dtype=int32)

In [16]: tfutil.print_constant(const2)

[[[[[[1]]

    [[2]]

    [[3]]]]

  [[[[4]]

    [[5]]

    [[6]]]]]]

In [17]: sq_const2 = tf.squeeze(const2, [0])

In [18]: print(sq_const2)

Tensor("Squeeze_1:0", shape=(2, 1, 3, 1, 1), dtype=int32)

In [19]: print(tf.shape(sq_const2))

Tensor("Shape_3:0", shape=(5,), dtype=int32)

In [20]: tfutil.print_operation_value(sq_const2)

[[[[[1]]

   [[2]]

   [[3]]]]

 [[[[4]]

   [[5]]

   [[6]]]]]

In [21]: sq_const2 = tf.squeeze(const2, [2])

In [22]: print(sq_const2)

Tensor("Squeeze_2:0", shape=(1, 2, 3, 1, 1), dtype=int32)

In [23]: print(tf.shape(sq_const2))

Tensor("Shape_4:0", shape=(5,), dtype=int32)

In [24]: tfutil.print_operation_value(sq_const2)

[[[[[1]]

   [[2]]

   [[3]]]

  [[[4]]

   [[5]]

   [[6]]]]]

In [25]: sq_const2 = tf.squeeze(const2, [02])

In [26]: print(sq_const2)

Tensor("Squeeze_3:0", shape=(2, 3, 1, 1), dtype=int32)

In [27]: print(tf.shape(sq_const2))

Tensor("Shape_5:0", shape=(4,), dtype=int32)

In [28]: tfutil.print_operation_value(sq_const2)

[[[[1]]

  [[2]]

  [[3]]]

 [[[4]]

  [[5]]

  [[6]]]]

In [29]: sq_const2 = tf.squeeze(const2, [24])

In [30]: print(sq_const2)

Tensor("Squeeze_4:0", shape=(1, 2, 3, 1), dtype=int32)

In [31]: print(tf.shape(sq_const2))

Tensor("Shape_6:0", shape=(4,), dtype=int32)

In [32]: tfutil.print_operation_value(sq_const2)

[[[[1]

   [2]

   [3]]

  [[4]

   [5]

   [6]]]]

In [33]: sq_const2 = tf.squeeze(const2, [024])

In [34]: print(sq_const2)

Tensor("Squeeze_5:0", shape=(2, 3, 1), dtype=int32)

In [35]: print(tf.shape(sq_const2))

Tensor("Shape_7:0", shape=(3,), dtype=int32)

In [36]: tfutil.print_operation_value(sq_const2)

[[[1]

  [2]

  [3]]

 [[4]

  [5]

  [6]]]

In [37]: sq_const2 = tf.squeeze(const2, [0245])

In [38]: print(sq_const2)

Tensor("Squeeze_6:0", shape=(2, 3), dtype=int32)

In [39]: print(tf.shape(sq_const2))

Tensor("Shape_8:0", shape=(2,), dtype=int32)

In [40]: tfutil.print_operation_value(sq_const2)

[[1 2 3]

 [4 5 6]]


tf.expand_dims(input, dim, name=None)


크기 1인 차원을 텐서의 구조(shape)에 삽입합니다.


input 텐서가 주어졌을 때, 이 함수는 크기가 1인 차원을 input의 구조에서 차원 인덱스 dim에 삽입합니다. 차원 인덱스 dim은 0부터 시작합니다. 만약 dim에 음수가 지정된다면, 끝에서부터 역으로 계산됩니다.


이 함수는 단일 원소에 배치 차원(batch dimension)을 추가할 때 유용합니다. 예로, 만약 구조 [height, width, channels]의 단일 이미지가 있는 경우, 이것에 expand_dims(image, 0)을 적용해 구조 [1, height, width, channels]인 하나의 이미지로 구성된 배치(batch)를 구성할 수 있습니다.


다른 예시들:

# 't'는 구조(shape) [2]의 텐서
shape(expand_dims(t, 0)) ==> [1, 2]
shape(expand_dims(t, 1)) ==> [2, 1]
shape(expand_dims(t, -1)) ==> [2, 1]

# 't2'는 구조(shape) [2, 3, 5]의 텐서
shape(expand_dims(t2, 0)) ==> [1, 2, 3, 5]
shape(expand_dims(t2, 2)) ==> [2, 3, 1, 5]
shape(expand_dims(t2, 3)) ==> [2, 3, 5, 1]


이 함수는 다음의 조건이 만족되어야 합니다:


-1-input.dims() <= dim <= input.dims()


이 함수는 크기 1인 차원을 제거하는 함수인 squeeze()와 연관되어 있습니다.

인자:
  • inputTensor.
  • dimint32형 Tensor. 0-D (스칼라). input의 구조에서 어떤 차원 인덱스에 삽입할 것인지 지정합니다.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

input과 같은 자료형의 Tensorinput과 같은 원소를 포함하지만, 하나 이상의 크기 1인 차원이 추가되어 있습니다.


출처: 텐서 변환


Tensorflow tf.expand_dims 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

In [3]: const1 = tf.constant([123])

In [4]: print(const1)

Tensor("Const:0", shape=(3,), dtype=int32)

In [5]: print(tf.shape(const1))

Tensor("Shape:0", shape=(1,), dtype=int32)

In [6]: tfutil.print_constant(const1)

[1 2 3]

In [7]: ed_const1 = tf.expand_dims(const1, 0)

In [8]: print(ed_const1)

Tensor("ExpandDims:0", shape=(1, 3), dtype=int32)

In [9]: tfutil.print_operation_value(ed_const1)

[[1 2 3]]

In [10]: print(tf.shape(ed_const1))

Tensor("Shape_1:0", shape=(2,), dtype=int32)

In [11]: ed_const1 = tf.expand_dims(const1, 1)

In [12]: print(ed_const1)

Tensor("ExpandDims_1:0", shape=(3, 1), dtype=int32)

In [13]: tfutil.print_operation_value(ed_const1)

[[1]

 [2]

 [3]]

In [14]: print(tf.shape(ed_const1))

Tensor("Shape_2:0", shape=(2,), dtype=int32)

In [15]: ed_const1 = tf.expand_dims(const1, 1)

In [16]: print(ed_const1)

Tensor("ExpandDims_2:0", shape=(3, 1), dtype=int32)

In [17]: tfutil.print_operation_value(ed_const1)

[[1]

 [2]

 [3]]

In [18]: print(tf.shape(ed_const1))

Tensor("Shape_3:0", shape=(2,), dtype=int32)

In [19]: ed_const1 = tf.expand_dims(const1, -1)

In [20]: print(ed_const1)

Tensor("ExpandDims_3:0", shape=(3, 1), dtype=int32)

In [21]: tfutil.print_operation_value(ed_const1)

[[1]

 [2]

 [3]]

In [22]: print(tf.shape(ed_const1))

Tensor("Shape_4:0", shape=(2,), dtype=int32)

In [23]: const2 = tf.constant([[[12345], [678910], [1112131415]], [[1617181920], [2122232425], [2627282930]]])

In [24]: print(const2)

Tensor("Const_1:0", shape=(2, 3, 5), dtype=int32)

In [25]: print(tf.shape(const2))

Tensor("Shape_5:0", shape=(3,), dtype=int32)

In [26]: tfutil.print_constant(const2)

[[[ 1  2  3  4  5]

  [ 6  7  8  9 10]

  [11 12 13 14 15]]

 [[16 17 18 19 20]

  [21 22 23 24 25]

  [26 27 28 29 30]]]

In [27]: ed_const2 = tf.expand_dims(const2, 0)

In [28]: print(ed_const2)

Tensor("ExpandDims_4:0", shape=(1, 2, 3, 5), dtype=int32)

In [29]: tfutil.print_operation_value(ed_const2)

[[[[ 1  2  3  4  5]

   [ 6  7  8  9 10]

   [11 12 13 14 15]]

  [[16 17 18 19 20]

   [21 22 23 24 25]

   [26 27 28 29 30]]]]

In [30]: print(tf.shape(ed_const2))

Tensor("Shape_6:0", shape=(4,), dtype=int32)

In [31]: ed_const2 = tf.expand_dims(const2, 1)

In [32]: print(ed_const2)

Tensor("ExpandDims_5:0", shape=(2, 1, 3, 5), dtype=int32)

In [33]: tfutil.print_operation_value(ed_const2)

[[[[ 1  2  3  4  5]

   [ 6  7  8  9 10]

   [11 12 13 14 15]]]

 [[[16 17 18 19 20]

   [21 22 23 24 25]

   [26 27 28 29 30]]]]

In [34]: print(tf.shape(ed_const2))

Tensor("Shape_7:0", shape=(4,), dtype=int32)

In [35]: ed_const2 = tf.expand_dims(const2, 2)

In [36]: print(ed_const2)

Tensor("ExpandDims_6:0", shape=(2, 3, 1, 5), dtype=int32)

In [37]: tfutil.print_operation_value(ed_const2)

[[[[ 1  2  3  4  5]]

  [[ 6  7  8  9 10]]

  [[11 12 13 14 15]]]

 [[[16 17 18 19 20]]

  [[21 22 23 24 25]]

  [[26 27 28 29 30]]]]

In [38]: print(tf.shape(ed_const2))

Tensor("Shape_8:0", shape=(4,), dtype=int32)

In [39]: ed_const2 = tf.expand_dims(const2, 3)

In [40]: print(ed_const2)

Tensor("ExpandDims_7:0", shape=(2, 3, 5, 1), dtype=int32)

In [41]: tfutil.print_operation_value(ed_const2)

[[[[ 1]

   [ 2]

   [ 3]

   [ 4]

   [ 5]]

  [[ 6]

   [ 7]

   [ 8]

   [ 9]

   [10]]

  [[11]

   [12]

   [13]

   [14]

   [15]]]

 [[[16]

   [17]

   [18]

   [19]

   [20]]

  [[21]

   [22]

   [23]

   [24]

   [25]]

  [[26]

   [27]

   [28]

   [29]

   [30]]]]

In [42]: print(tf.shape(ed_const2))

Tensor("Shape_9:0", shape=(4,), dtype=int32)

In [43]: ed_const2 = tf.expand_dims(const2, -1)

In [44]: print(ed_const2)

Tensor("ExpandDims_8:0", shape=(2, 3, 5, 1), dtype=int32)

In [45]: tfutil.print_operation_value(ed_const2)

[[[[ 1]

   [ 2]

   [ 3]

   [ 4]

   [ 5]]

  [[ 6]

   [ 7]

   [ 8]

   [ 9]

   [10]]

  [[11]

   [12]

   [13]

   [14]

   [15]]]

 [[[16]

   [17]

   [18]

   [19]

   [20]]

  [[21]

   [22]

   [23]

   [24]

   [25]]

  [[26]

   [27]

   [28]

   [29]

   [30]]]]

In [46]: print(tf.shape(ed_const2))

Tensor("Shape_10:0", shape=(4,), dtype=int32)


이 포스팅은 머신러닝/딥러닝 오픈소스 Tensorflow 개발을 위한 선행학습으로 Tensorflow API Document의 Python API 대한 학습노트입니다.

Posted by 이성윤