TensorFlow(二)数据类型


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

数值类型

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

  • 标量(Scalar)。 单个的实数,如 1.2, 3.4 等,维度(Dimension)数为 0, shape 为[]。
  • 向量(Vector)。 n个实数的有序集合,通过中括号包裹,如[1.2], [1.2, 3.4]等,维度数
    为 1,长度不定, shape 为[n]。
    — 矩阵(Matrix)。 n行m列实数的有序集合。维度数为 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

a = 1.2 # python 语言方式创建标量
aa = tf.constant(1.2) # TF 方式创建标量

print(type(a))
print(type(aa))
print(tf.is_tensor(aa))

输出:

<class 'float'>
<class 'tensorflow.python.framework.ops.EagerTensor'>
True

如果要使用 TensorFlow 提供的功能函数, 须通过 TensorFlow 规定的方式去创建张量,而不能使用 Python 语言的标准变量创建方式。

数值精度

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

待优化张量

  为了区分需要计算梯度信息的张量与不需要计算梯度信息的张量, TensorFlow 增加了一种专门的数据类型来支持梯度信息的记录: tf.Variable。 tf.Variable 类型在普通的张量类型基础上添加了 name, trainable 等属性来支持计算图的构建。 由于梯度运算会消耗大量的计算资源,而且会自动更新相关参数,对于不需要的优化的张量,如神经网络的输入X,不需要通过 tf.Variable 封装;相反,对于需要计算梯度并优化的张量, 如神经网络层的W和b, 需要通过 tf.Variable 包裹以便 TensorFlow 跟踪相关梯度信息。
  通过 tf.Variable()函数可以将普通张量转换为待优化张量,例如:

a = tf.constant([-1, 0, 1, 2]) # 创建 TF 张量
aa = tf.Variable(a) # 转换为 Variable 类型
aa.name, aa.trainable # Variable 类型张量的属性

输出:

('Variable:0', True)

  其中张量的 name 和 trainable 属性是 Variable 特有的属性, name 属性用于命名计算图中的变量,这套命名体系是 TensorFlow 内部维护的, 一般不需要用户关注 name 属性; trainable属性表征当前张量是否需要被优化,创建 Variable 对象时是默认启用优化标志,可以设置trainable=False 来设置张量不需要优化。
  除了通过普通张量方式创建 Variable, 也可以直接创建,例如:

a = tf.Variable([[1,2],[3,4]])

输出:

<tf.Variable 'Variable:0' shape=(2, 2) dtype=int32, numpy=
array([[1, 2],
       [3, 4]])>

  待优化张量可视为普通张量的特殊类型, 普通张量其实也可以通过 GradientTape.watch()方法临时加入跟踪梯度信息的列表,从而支持自动求导功能。

创建张量

  在 TensorFlow 中,可以通过多种方式创建张量,如从 Python 列表对象创建,从Numpy 数组创建,或者创建采样自某种已知分布的张量等。

从数组、列表对象创建

  Numpy Array 数组和 Python List 列表是 Python 程序中间非常重要的数据载体容器, 很多数据都是通过 Python 语言将数据加载至 Array 或者 List 容器,再转换到 Tensor 类型,通过 TensorFlow 运算处理后导出到 Array 或者 List 容器,方便其他模块调用。
  通过 tf.convert_to_tensor 函数可以创建新 Tensor,并将保存在 Python List 对象或者Numpy Array 对象中的数据导入到新 Tensor 中,例如:

tf.convert_to_tensor([1,2.]) # 从列表创建张量
<tf.Tensor: id=108, shape=(2,), dtype=float32, numpy=array([1., 2.], dtype=float32)>

tf.convert_to_tensor(np.array([[1,2.],[3,4]])) # 从数组中创建张量
<tf.Tensor: id=109, shape=(2, 2), dtype=float64, numpy=
array([[1., 2.],
       [3., 4.]])>

  实际上, tf.constant()和 tf.convert_to_tensor()都能够自动的把 Numpy 数组或者 Python列表数据类型转化为 Tensor 类型,这两个 API 命名来自 TensorFlow 1.x 的命名习惯,在TensorFlow 2 中函数的名字并不是很贴切,使用其一即可。

创建全 0 或全 1 张量

  将张量创建为全 0 或者全 1 数据是非常常见的张量初始化手段。考虑线性变换y = wx + b, 将权值矩阵w初始化为全 1 矩阵,偏置 b 初始化为全 0 向量,此时线性变化层输出y = x, 因此是一种比较好的层初始化状态。 通过 tf.zeros()和 tf.ones()即可创建任意形状,且内容全 0 或全 1 的张量。例如,创建为 0 和为 1 的标量:
在这里插入图片描述
  通过 tf.zeros_like, tf.ones_like 可以方便地新建与某个张量 shape 一致, 且内容为全 0 或全 1 的张量。例如,创建与张量a形状一样的全 0 张量:

a = tf.ones([2,3]) # 创建一个矩阵

tf.zeros_like(a) # 创建一个与 a 形状相同,但是全 0 的新矩阵
<tf.Tensor: id=127, shape=(2, 3), dtype=float32, numpy=
array([[0., 0., 0.],
       [0., 0., 0.]], dtype=float32)>

  tf.*_like 是一系列的便捷函数,也可以通过 tf.zeros(a.shape)等方式实现。

创建自定义数值张量

  除了初始化为全 0, 或全 1 的张量之外,有时也需要全部初始化为某个自定义数值的张量,比如将张量的数值全部初始化为−1等。
  通过 tf.fill(shape, value)可以创建全为自定义数值 value 的张量,形状由 shape 参数指定。 例如,创建元素为−1的标量:
在这里插入图片描述

创建已知分布的张量

  正态分布(Normal Distribution,或 Gaussian Distribution)和均匀分布(UniformDistribution)是最常见的分布之一,创建采样自这 2 种分布的张量非常有用,比如在卷积神经网络中,卷积核张量W初始化为正态分布有利于网络的训练;在对抗生成网络中,隐藏变量z一般采样自均匀分布。
  通过 tf.random.normal(shape, mean=0.0, stddev=1.0)可以创建形状为 shape,均值为mean,标准差为 stddev 的正态分布N(mean, stddev2)。例如,创建均值为 0,标准差为 1的正态分布(默认值):
在这里插入图片描述
  通过 tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32)可以创建采样自[minval, maxval)区间的均匀分布的张量。例如创建采样自区间[0,1), shape 为[2,2]的矩阵:
在这里插入图片描述

创建序列

  在循环计算或者对张量进行索引时,经常需要创建一段连续的整型序列,可以通过tf.range()函数实现。 tf.range(limit, delta=1)可以创建[0, limit)之间,步长为 delta 的整型序列,不包含 limit 本身。例如,创建 0~10,步长为 1 的整型序列。通过 tf.range(start, limit, delta=1)可以创建[start, limit),步长为 delta 的序列,不包含limit 本身。
在这里插入图片描述

文章来源

本文完全来源于https://github.com/dragen1860/Deep-Learning-with-TensorFlow-book,感谢原作者的完美工作,这是tf2.0的内容,超级棒。我只是用jupter notebook学习一遍,供本文和大家参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值