[API] Tensorflow Convert to Tensor - Casting

(텐서플로우 텐서 변환 - 형변환)

참고: Tensor를 인자로 받는 함수들은, tf.convert_to_tensor의 인자가 될 수 있는 것들 또한 인자로 받을 수 있습니다.


형변환 (Casting)

TensorFlow는 그래프에 사용되는 텐서 자료형들을 형변환(cast)할 수 있는 몇 가지 함수를 제공합니다.


tf.string_to_number(string_tensor, out_type=None, name=None)


입력 텐서의 각 문자열(string)을 지정된 자료형의 값으로 변환합니다.


(참고로, int32 오버플로우는 에러를 내며, float 오버플로우는 반올림한 결과를 냅니다.)


인자:
  • string_tensor: stringTensor.
  • out_type: tf.DType 오브젝트. tf.float32 또는 tf.int32이어야 하며, 기본값은 tf.float32입니다. 이 자료형으로 string_tensor의 문자열이 변환됩니다. (선택사항)
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

out_type형의 Tensor. 출력 텐서는 입력 텐서 string_tensor와 같은 구조(shape)를 가집니다.


출처: 텐서 변환


Tensorflow tf.string_to_number 결과

In [1]: import tensorflow as tf

In [2]: import tfutil
In [3]: var = tf.Variable("500", dtype=tf.string)
In [4]: tfutil.print_variable(var)
500
In [5]: print(var)
<tf.Variable 'Variable:0' shape=() dtype=string_ref>
In [6]: num1 = tf.string_to_number(var, out_type=tf.int32)
In [7]: tfutil.print_operation_value(num1)
500
In [8]: print(num1)
Tensor("StringToNumber:0", shape=(), dtype=int32)

tf.to_double(x, name='ToDouble')


텐서를 float64형으로 변환합니다.

인자:
  • x: Tensor 또는 SparseTensor.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

x와 구조(shape)가 같은 float64형의 Tensor 또는 SparseTensor.

예외:
  • TypeError: xfloat64형으로 변환될 수 없는 경우.


출처: 텐서 변환


Tensorflow tf.to_double 결과

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]: double1 = tf.to_double(const1)

In [7]: tfutil.print_operation_value(double1)

1.0

In [8]: print(double1)

Tensor("ToDouble:0", shape=(), dtype=float64)

In [9]: const2 = tf.constant([2, 3])

In [10]:tfutil.print_constant(const2)

[2 3]

In [11]: print(const2)

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

In [12]: double2 = tf.to_double(const2)

In [13]: tfutil.print_operation_value(double2)

[ 2.  3.]

In [14]: print(double2)

Tensor("ToDouble_1:0", shape=(2,), dtype=float64)


tf.to_float(x, name='ToFloat')


텐서를 float32형으로 변환합니다.

인자:
  • x: Tensor 또는 SparseTensor.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

x와 구조(shape)가 같은 float32형의 Tensor 또는 SparseTensor.

예외:
  • TypeError: xfloat32형으로 변환될 수 없는 경우.

출처: 텐서 변환


Tensorflow tf.to_float 결과

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]: float1 = tf.to_float(const1)

In [7]: tfutil.print_operation_value(float1)

1.0

In [8]: print(float1)

Tensor("ToFloat:0", shape=(), dtype=float32)

In [9]: const2 = tf.constant([23])

In [10]: tfutil.print_constant(const2)

[2 3]

In [11]: print(const2)

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

In [12]: float2 = tf.to_float(const2)

In [13]: tfutil.print_operation_value(float2)

[ 2.  3.]

In [14]: print(float2)

Tensor("ToFloat_1:0", shape=(2,), dtype=float32)


tf.to_bfloat16(x, name='ToBFloat16')


텐서를 bfloat16형으로 변환합니다.

인자:
  • x: Tensor 또는 SparseTensor.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

x와 구조(shape)가 같은 bfloat16형의 Tensor 또는 SparseTensor.

예외:
  • TypeError: xbfloat16형으로 변환될 수 없는 경우.

출처: 텐서 변환


Tensorflow tf.to_bfloat16 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

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

In [4]: tfutil.print_constant(const1)

1.0

In [5]: print(const1)

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

In [6]: bfloat1 = tf.to_bfloat16(const1)

In [7]: tfutil.print_operation_value(bfloat1)

16256

In [8]: print(bfloat1)

Tensor("ToBFloat16:0", shape=(), dtype=bfloat16)

In [9]: const2 = tf.constant([23], dtype=tf.float32)

In [10]: tfutil.print_constant(const2)

[ 2.  3.]

In [11]: print(const2)

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

In [12]: bfloat2 = tf.to_bfloat16(const2)

In [13]: tfutil.print_operation_value(bfloat2)

[16384 16448]

In [14]: print(bfloat2)

Tensor("ToBFloat16_1:0", shape=(2,), dtype=bfloat16)


tf.to_int32(x, name='ToInt32')


텐서를 int32형으로 변환합니다.

인자:
  • x: Tensor 또는 SparseTensor.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

x와 구조(shape)가 같은 int32형의 Tensor 또는 SparseTensor.

예외:
  • TypeError: xint32형으로 변환될 수 없는 경우.

출처: 텐서 변환


Tensorflow tf.to_int32 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

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

In [4]: tfutil.print_constant(const1)

1.0

In [5]: print(const1)

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

In [6]: int32_1 = tf.to_int32(const1)

In [7]: tfutil.print_operation_value(int32_1)

1

In [8]: print(int32_1)

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

In [9]: const2 = tf.constant([2, 3], dtype=tf.float32)

In [10]: tfutil.print_constant(const2)

[ 2.  3.]

In [11]: print(const2)

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

In [12]: int32_2 = tf.to_int32(const2)

In [13]: tfutil.print_operation_value(int32_2)

[2 3]

In [14]: print(int32_2)

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


tf.to_int64(x, name='ToInt64')


텐서를 int64형으로 변환합니다.

인자:
  • x: Tensor 또는 SparseTensor.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

x와 구조(shape)가 같은 int64형의 Tensor 또는 SparseTensor.

예외:
  • TypeError: xint64형으로 변환될 수 없는 경우.

출처: 텐서 변환


Tensorflow tf.to_int64 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

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

In [4]: tfutil.print_constant(const1)

1.0

In [5]: print(const1)

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

In [6]: int64_1 = tf.to_int64(const1)

In [7]: tfutil.print_operation_value(int64_1)

1

In [8]: print(int64_1)

Tensor("ToInt64:0", shape=(), dtype=int64)

In [9]: const2 = tf.constant([2, 3], dtype=tf.float32)

In [10]: tfutil.print_constant(const2)

[ 2.  3.]

In [11]: print(const2)

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

In [12]: int64_2 = tf.to_int64(const2)

In [13]: tfutil.print_operation_value(int64_2)

[2 3]

In [14]: print(int64_2)

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


tf.cast(x, dtype, name=None)


텐서를 새로운 자료형으로 변환합니다.


x(Tensor의 경우) 또는 x.values(SparseTensor의 경우)를 dtype형으로 변환합니다.


예시:

# 텐서 `a`는 [1.8, 2.2], 자료형은 tf.float

tf.cast(a, tf.int32) ==> [1, 2]  # dtype=tf.int32

인자:
  • x: Tensor 또는 SparseTensor.
  • dtype: 변환될 자료형.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

x와 구조(shape)가 같은 int64형의 Tensor 또는 SparseTensor.

예외:
  • TypeError: xdtype형으로 변환될 수 없는 경우.

출처: 텐서 변환


Tensorflow tf.cast 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

In [3]: const1 = tf.constant(127, dtype=tf.int32)

In [4]: tfutil.print_constant(const1)

127

In [5]: print(const1)

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

In [6]: f32 = tf.cast(const1, tf.float32)

In [7]: tfutil.print_operation_value(f32)

127.0

In [8]: print(f32)

Tensor("Cast:0", shape=(), dtype=float32)

In [9]: f64 = tf.cast(const1, tf.float64)

In [10]: tfutil.print_operation_value(f64)

127.0

In [11]: print(f64)

Tensor("Cast_1:0", shape=(), dtype=float64)

In [12]: i8 = tf.cast(const1, tf.int8)

In [13]: tfutil.print_operation_value(i8)

127

In [14]: print(i8)

Tensor("Cast_2:0", shape=(), dtype=int8)

In [15]: i16 = tf.cast(const1, tf.int16)

In [16]: tfutil.print_operation_value(i16)

127

In [17]: print(i16)

Tensor("Cast_3:0", shape=(), dtype=int16)

In [18]: i64 = tf.cast(const1, tf.int64)

In [19]: tfutil.print_operation_value(i64)

127

In [20]: print(i64)

Tensor("Cast_4:0", shape=(), dtype=int64)

In [21]: u8 = tf.cast(const1, tf.uint8)

In [22]: tfutil.print_operation_value(u8)

127

In [23]: print(u8)

Tensor("Cast_5:0", shape=(), dtype=uint8)

In [24]: const2 = tf.constant([127, 255])

In [25]: tfutil.print_constant(const2)

[127 255]

In [26]: print(const2)

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

In [27]: f32 = tf.cast(const2, tf.float32)

In [28]: tfutil.print_operation_value(f32)

[ 127.  255.]

In [29]: print(f32)

Tensor("Cast_6:0", shape=(2,), dtype=float32)

In [30]: f64 = tf.cast(const2, tf.float64)

In [31]: tfutil.print_operation_value(f64)

[ 127.  255.]

In [32]: print(f64)

Tensor("Cast_7:0", shape=(2,), dtype=float64)

In [33]: i8 = tf.cast(const2, tf.int8)

In [34]: tfutil.print_operation_value(i8)

[127  -1]

In [35]: print(i8)

Tensor("Cast_8:0", shape=(2,), dtype=int8)

In [36]: i16 = tf.cast(const2, tf.int16)

In [37]: tfutil.print_operation_value(i16)

[127 255]

In [38]: print(i16)

Tensor("Cast_9:0", shape=(2,), dtype=int16)

In [39]: i64 = tf.cast(const2, tf.int64)

In [40]: tfutil.print_operation_value(i64)

[127 255]

In [41]: print(i64)

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

In [42]: u8 = tf.cast(const2, tf.uint8)

In [43]: tfutil.print_operation_value(u8)

[127 255]

In [44]: print(u8)

Tensor("Cast_11:0", shape=(2,), dtype=uint8)


tf.saturate_cast(value, dtype, name=None)


valuedtype 형으로 안전하게 포화 형변환(saturating cast)합니다.


이 함수는 입력을 dtype으로 스케일링(scaling) 없이 변환합니다. 형변환 시 오버플로우나 언더플로우가 발생할 수 있는 값들에 대해, 이 함수는 해당 값들을 허용되는 값 범위로 넣은 뒤 형변환을 진행합니다.

인자:
  • value: Tensor.
  • dtype: DType 오브젝트. 변환될 자료형.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

dtype형으로 안전하게 변환된 value.


출처: 텐서 변환


Tensorflow tf.saturate_cast 결과

In [1]: import tensorflow as tf

In [2]: import tfutil

In [3]: const1 = tf.constant(127, dtype=tf.int32)

In [4]: tfutil.print_constant(const1)

127

In [5]: print(const1)

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

In [6]: f32 = tf.saturate_cast(const1, tf.float32)

In [7]: tfutil.print_operation_value(f32)

127.0

In [8]: print(f32)

Tensor("saturate_cast:0", shape=(), dtype=float32)

In [9]: f64 = tf.saturate_cast(const1, tf.float64)

In [10]: tfutil.print_operation_value(f64)

127.0

In [11]: print(f64)

Tensor("saturate_cast_1:0", shape=(), dtype=float64)

In [12]: i8 = tf.saturate_cast(const1, tf.int8)

In [13]: tfutil.print_operation_value(i8)

127

In [14]: print(i8)

Tensor("saturate_cast_2:0", shape=(), dtype=int8)

In [15]: i16 = tf.saturate_cast(const1, tf.int16)

In [16]: tfutil.print_operation_value(i16)

127

In [17]: print(i16)

Tensor("saturate_cast_3:0", shape=(), dtype=int16)

In [18]: i64 = tf.saturate_cast(const1, tf.int64)

In [19]: tfutil.print_operation_value(i64)

127

In [20]: print(i64)

Tensor("saturate_cast_4:0", shape=(), dtype=int64)

In [21]: u8 = tf.saturate_cast(const1, tf.uint8)

In [22]: tfutil.print_operation_value(u8)

127

In [23]: print(u8)

Tensor("saturate_cast_5:0", shape=(), dtype=uint8)

In [24]: const2 = tf.constant([127, 255])

In [25]: tfutil.print_constant(const2)

[127 255]

In [26]: print(const2)

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

In [27]: f32 = tf.saturate_cast(const2, tf.float32)

In [28]: tfutil.print_operation_value(f32)

[ 127.  255.]

In [29]: print(f32)

Tensor("saturate_cast_6:0", shape=(2,), dtype=float32)

In [30]: f64 = tf.saturate_cast(const2, tf.float64)

In [31]: tfutil.print_operation_value(f64)

[ 127.  255.]

In [32]: print(f64)

Tensor("saturate_cast_7:0", shape=(2,), dtype=float64)

In [33]: i8 = tf.saturate_cast(const2, tf.int8)

In [34]: tfutil.print_operation_value(i8)

[127 127]

In [35]: print(i8)

Tensor("saturate_cast_8:0", shape=(2,), dtype=int8)

In [36]: i16 = tf.saturate_cast(const2, tf.int16)

In [37]: tfutil.print_operation_value(i16)

[127 255]

In [38]: print(i16)

Tensor("saturate_cast_9:0", shape=(2,), dtype=int16)

In [39]: i64 = tf.saturate_cast(const2, tf.int64)

In [40]: tfutil.print_operation_value(i64)

[127 255]

In [41]: print(i64)

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

In [42]: u8 = tf.saturate_cast(const2, tf.uint8)

In [43]: tfutil.print_operation_value(u8)

[127 255]

In [44]: print(u8)

Tensor("saturate_cast_11:0", shape=(2,), dtype=uint8)


tf.bitcast(input, type, name=None)


텐서를 다른 자료형으로 데이터 복사 없이 비트캐스트(bitcast)합니다.


input 텐서가 주어질 때, 이 함수는 input과 같은 버퍼 데이터를 가진 자료형 type의 텐서를 반환합니다.

만약 입력의 자료형 T가 출력의 자료형 type에 비해 더 큰 경우, 구조(shape)가 [...]에서 [..., sizeof(T)/sizeof(type)]으로 변형됩니다.

만약 T가 type에 비해 더 작은 경우, 가장 오른쪽의 차원이 sizeof(type)/sizeof(T)와 같아야 합니다. 구조는 [..., sizeof(type)/sizeof(T)] to [...]으로 변형됩니다.

인자:
  • inputTensor. 다음의 자료형이 가능합니다: float32float64int64int32uint8uint16int16int8complex64complex128qint8quint8qint32half.
  • typetf.DType. 다음 중 하나가 가능합니다: tf.float32, tf.float64, tf.int64, tf.int32, tf.uint8, tf.uint16, tf.int16, tf.int8, tf.complex64, tf.complex128, tf.qint8, tf.quint8, tf.qint32, tf.half.
  • name: 오퍼레이션의 명칭. (선택사항)
반환값:

type 자료형의 Tensor.


출처: 텐서 변환


Tensorflow tf.bitcast 결과

In [1]:

import tensorflow as tf

import numpy as np

import tfutil

In [2]:

= 37.0

const1 = tf.constant(x) 

print(const1)

print(tf.shape(const1))

tfutil.print_constant(const1)

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

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

37.0

In [3]:

bc_const1 = tf.bitcast(const1, tf.int32)

print(bc_const1)

print(tf.shape(bc_const1))

tfutil.print_operation_value(bc_const1)

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

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

1108606976

In [4]:

= -1

invert_bits = tf.constant(x) - bc_const1

print(invert_bits)

print(tf.shape(invert_bits))

tfutil.print_operation_value(invert_bits)

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

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

-1108606977

In [5]:

bc_to_float = tf.bitcast(invert_bits, tf.float32)

print(bc_to_float)

print(tf.shape(bc_to_float))

tfutil.print_operation_value(bc_to_float)

Tensor("Bitcast_1:0", shape=(), dtype=float32)

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

-0.115234


tf.shape_n(input, name=None)


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


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

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

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


출처: 텐서 변환



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

Posted by 이성윤