欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TensorFlow中的数据类型以及类型转换

程序员文章站 2024-03-11 16:44:55
...

TensorFlow 中的基本数据类型:数值类型、字符串类型和布尔类型。

1、数值类型

数值类型的张量是 TensorFlow 的主要数据载体。
张量根据维度数来区分,可分为:

  • 标量(Scalar)。单个的实数,如 1.2, 3.4 等,维度(Dimension)数为 0,shape=()。
  • 向量(Vector)。n个实数的有序集合,如[1.2],[1.2,3.4]等,维度数为 1,长度不定,shape=(n,)。
  • 矩阵(Matrix)。n 行 m 列实数的有序集合,如[[1,2],[3,4]],维度数为 2,每个维度上的长度不定,shape=([n,m])。
  • 张量(Tensor)。所有维度数dim > 2的数组统称为张量。张量的每个维度叫作轴(Axis),一般维度代表了具体的物理含义,如 Shape=[2,32,32,3]的张量,维度数为 4 ,如果表示图片数据的话,每个维度/轴代表的含义分别是图片数量、图片高度、图片宽度、图片通道数,其中 2 代表了 2 张图片,32 代表了高、宽均为 32,3 代表了 RGB 共 3 个通道。张量的维度数以及每个维度所代表的具体物理含义需要由用户自行定义。

在 TensorFlow 中,一般把标量、向量、矩阵也统称为张量,不作区分,需要根据张量的维度数或形状自行判断。

张量是如何创建的呢?

import tensorflow as tf

sca = tf.constant(1.2)  # 标量
print(sca)
# out:tf.Tensor(1.2, shape=(), dtype=float32)

vec = tf.constant([1, 2, 3, 4, 5])  # 向量
print(vec)
# out:tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)

mat = tf.constant([[1, 2], [3, 4]])  # 矩阵
print(mat)
# out:[[1 2]
#     [3 4]], shape=(2, 2), dtype=int32)


ten = tf.constant([[[1, 2], [3, 4]],  [[5, 6], [7, 8]]])  # 三维张量
print(ten)
'''
out:tf.Tensor(
[[[1 2]
  [3 4]]
 [[5 6]
  [7 8]]], shape=(2, 2, 2), dtype=int32)
'''

对于数值类型的张量,可以保存为不同字节长度的精度,如浮点数 3.14 既可以保存为16 位(Bit)长度,也可以保存为 32 位甚至 64 位的精度。位越长,精度越高,同时占用的内存空间也就越大。常用的精度类型有 tf.int16、tf.int32、tf.int64、tf.float16、tf.float32、tf.float64 等,其中 tf.float64 即为 tf.double。

2、字符串类型

TensorFlow 还支持字符串(String) 类型的数据,通过传入字符串对象即可创建字符串类型的张量。

str = tf.constant("Hello,TF!")
print(str)
# out:tf.Tensor(b'Hello,TF!', shape=(), dtype=string)

在 tf.strings 模块中,提供了常见的字符串类型的工具函数,如小写化 lower()、拼接
join()、长度 length()、切分 split()等。

print(tf.strings.lower(str))
# out:tf.Tensor(b'hello,tf!', shape=(), dtype=string)

主要还是以数值类型张量运算为主,字符串类型的数据使用频率较低,一般不经常用。

3.布尔类型

TensorFlow 还支持布尔类型(Boolean,简称 bool)的张量。布尔类型的张量只需要传入 Python 语言的布尔类型数据,转换成 TensorFlow 内部布尔型即可。

boo = tf.constant(True)  # 布尔类型标量
print(boo)
# out:tf.Tensor(True, shape=(), dtype=bool)

boo_1 = tf.constant([False, True])  # 布尔类型向量
print(boo_1)
# out:tf.Tensor([False  True], shape=(2,), dtype=bool)

注意:TensorFlow 的布尔类型和 Python 语言的布尔类型并不等价,不能通用。

4.类型转换

每个模块使用的数据类型、数值精度可能各不相同,对于不符合要求的张量的类型及精度,需要通过 tf.cast 函数进行转换。但要注意的是,进行类型转换时,需要保证转换操作的合法性。尤其注意下面两点:
(1)数据溢出(高精度的张量转换为低精度的张量)
正常

import numpy as np
pi = tf.constant(np.pi,dtype=tf.float16)  # 创建 tf.float16 低精度张量pi
print(pi)
# out:tf.Tensor(3.14, shape=(), dtype=float16)

print(tf.cast(pi, tf.float32))
# out:tf.Tensor(3.140625, shape=(), dtype=float32)

溢出

a = tf.constant(123456789, dtype=tf.int32)  # 高精度浮点型
aa = tf.cast(a, tf.int16)   # 转换为低精度整型
print(a)
# out:tf.Tensor(123456789, shape=(), dtype=int32)
print(aa)
# out:tf.Tensor(-13035, shape=(), dtype=int16)

(2)布尔类型与整型的转换
注意:布尔类型与整型之间相互转换是合法的,是比较常见的操作。在 TensorFlow 中,一般默认 0 表示 False,1 表示 True,且将非 0 数字都视为 True。

a = tf.constant([True, False])
aa = tf.cast(a, tf.int32)  # 布尔类型转整型
print(aa)
# out:tf.Tensor([1 0], shape=(2,), dtype=int32)

a = tf.constant([-1, 0, 1, 2])
aa = tf.cast(a, tf.bool)  # 整型转布尔类型
print(aa)
# out:tf.Tensor([ True False  True  True], shape=(4,), dtype=bool)