[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]
인자:
input
:Tensor
.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([1, 2])
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([[1, 2], [3, 4]])
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([[1, 2], [3, 4], [5, 6]])
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]:
x = [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]:
x = [1, 2]
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]:
x = [[1, 2], [3, 4]]
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]:
x = [[1, 2], [3, 4], [5, 6]]
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]:
x = [[[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]:
x = [[[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
인자:
input
:Tensor
.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([1, 2])
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([[1, 2], [3, 4]])
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([[1, 2], [3, 4], [5, 6]])
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([1, 2])
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([[1, 2], [3, 4]])
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([[1, 2], [3, 4], [5, 6]])
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
인자:
tensor
:Tensor
.shape
:int32
형Tensor
. 출력 텐서의 구조(shape) 지정.name
: 오퍼레이션의 명칭. (선택사항)
반환값:
tensor
와 같은 자료형의 Tensor
.
출처: 텐서 변환
Tensorflow tf.reshape 결과
In [1]: import tensorflow as tf
In [2]: import tfutil
In [3]: const1 = tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9])
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, [3, 3])
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([[[1, 1], [2, 2]], [[3, 3], [4, 4]]])
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, [2, 4])
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([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]])
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([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6])
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([[1, 1, 1, 2, 2, 2, 3, 3, 3], [4, 4, 4, 5, 5, 5, 6, 6, 6]])
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, -1, 3])
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
으로 지정하기:
인자:
input
:Tensor
.squeeze_dims
:int
의 리스트. 기본값은[]
. 지정된 경우, 리스트 안의 차원만 제거합니다. 크기가 1이 아닌 차원을 제거하는 것은 오류입니다. (선택사항)name
: 오퍼레이션의 명칭. (선택사항)
반환값:
input
과 같은 자료형의 Tensor
. input
과 같은 원소를 포함하지만, 하나 이상의 크기 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, [0, 2])
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, [2, 4])
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, [0, 2, 4])
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, [0, 2, 4, 5])
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)를 구성할 수 있습니다.
다른 예시들:
이 함수는 다음의 조건이 만족되어야 합니다:
-1-input.dims() <= dim <= input.dims()
이 함수는 크기 1인 차원을 제거하는 함수인 squeeze()
와 연관되어 있습니다.
인자:
input
:Tensor
.dim
:int32
형Tensor
. 0-D (스칼라).input
의 구조에서 어떤 차원 인덱스에 삽입할 것인지 지정합니다.name
: 오퍼레이션의 명칭. (선택사항)
반환값:
input
과 같은 자료형의 Tensor
. input
과 같은 원소를 포함하지만, 하나 이상의 크기 1인 차원이 추가되어 있습니다.
출처: 텐서 변환
Tensorflow tf.expand_dims 결과
In [1]: import tensorflow as tf
In [2]: import tfutil
In [3]: const1 = tf.constant([1, 2, 3])
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([[[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 [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 대한 학습노트입니다.
'머신러닝&딥러닝 개발 > Tensorflow API' 카테고리의 다른 글
[API] Tensorflow Math (텐서플로우 수학 함수) (0) | 2018.01.17 |
---|---|
[API] Tensorflow Convert to Tensor - slicing and joining(텐서플로우 텐서 변환 - 자르고 붙이기) (0) | 2018.01.13 |
[API] Tensorflow Convert to Tensor - Casting (텐서플로우 텐서 변환 - 형변환) (0) | 2018.01.13 |
[API] Tensorflow Variables (텐서플로우 변수) (0) | 2018.01.13 |
[API] Tensorflow Constant, Sequence and Random Seed (텐서플로우 상수, 시퀀스, 그리고 난수) (0) | 2018.01.12 |