常用张量生成方法
生成全 0 的张量
在神经网络中,有时需要设置一些变量的初始值为 0
,可以利用 tf.zeros()
方法来初始化值全为 0
的张量,该方法的原型如下:
tf.zeros(
shape,
dtype=tf.dtypes.float32,
name=None
)
shape
:表示张量的尺寸,通过用列表或元组来表示。dtype
:表示张量的数据类型,默认为32
位浮点数。name
:表示当前操作的名称,默认值为None
。
我们通过举例来说明 tf.zeros()
的具体用法:
import tensorflow as tf
a = tf.zeros(5, dtype=tf.int32) # 一维张量,数值类型为 int32
b = tf.zeros([2, 5], dtype=tf.int32) # 二维张量,数值类型为 int32
c = tf.zeros((3, 3)) # 二维张量,数值类型为 float32
print(a)
print(b)
print(c)
上述代码运行结果为:
tf.Tensor([0 0 0 0 0], shape=(5,), dtype=int32)
tf.Tensor(
[[0 0 0 0 0]
[0 0 0 0 0]], shape=(2, 5), dtype=int32)
tf.Tensor(
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]], shape=(3, 3), dtype=float32)
还可以利用 tf.zeros_like()
方法来生成全 0
的张量,该方法可以借用其他给定张量的尺寸和数值类型来生成对应的张量,其中所有的值都会被替换为 0
,如下所示:
a_cons = tf.constant([[1, 2, 3.0], [4, 5, 6]])
print(a_cons)
上述代码运行结果为:
tf.Tensor(
[[1. 2. 3.]
[4. 5. 6.]], shape=(2, 3), dtype=float32)
b_zero = tf.zeros_like(a_cons) # 借用 a_cons 的类型和维度
print(b_zero)
上述代码运行结果为:
tf.Tensor(
[[0. 0. 0.]
[0. 0. 0.]], shape=(2, 3), dtype=float32)
在上述代码中,a_cons
常量中包含了不同精度的数值,在 TensorFlow 和 Numpy 中,数据类型遵循“就高不就低”原则,即张量的数据类型以最高精度的数值类型为准(a_cons
中最高精度的元素为 3.0
,那么张量的数据类型就为浮点型)。
当然,tf.zeros_like()
方法也可以指定数值类型:
c_zero = tf.zeros_like(a_cons, dtype=tf.int32) # 修改数据类型为 int32
print(c_zero)
上述代码运行结果为:
tf.Tensor(
[[0 0 0]
[0 0 0]], shape=(2, 3), dtype=int32)
生成全 1 的张量
我们也可以通过 tf.ones()
方法生成值全为 1
的张量:
all_one = tf.ones([2, 3], dtype=tf.int32)
print(all_one)
上述代码运行结果为:
tf.Tensor(
[[1 1 1]
[1 1 1]], shape=(2, 3), dtype=int32)
类似于 tf.zeros_like()
方法,我们也可以利用 tf.ones_like()
方法,借用其他张量的数据类型和尺寸在生成全为 1 的张量:
all_one_like = tf.ones_like(a_cons)
print(all_one_like)
上述代码运行结果为:
tf.Tensor(
[[1. 1. 1.]
[1. 1. 1.]], shape=(2, 3), dtype=float32)
生成全为给定值的张量
我们可以利用 tf.fill()
方法来生成全为给定值的张量,该方法的原型如下:
tf.fill(
dims, # 张量的尺寸
value, # 给定的值
name=None # 当前操作的名称
)
下面我们通过一个例子来看看 tf.fill()
方法的具体用法:
fill = tf.fill([2, 3], 6) # 生成 2 行 3 列,且值为 6 的张量
print(fill)
上述代码运行结果为:
tf.Tensor(
[[6 6 6]
[6 6 6]], shape=(2, 3), dtype=int32)
生成已知分布的随机数张量
正态分布(Normal Distribution
,也称为高斯分布)和均匀分布是最常用的分布,在卷积神经网络中,经常会用到这两种分布。
生成正态分布张量
我们可以通过 tf.random_normal()
方法来生成一个正态分布张量,该方法的原型如下:
tf.random.normal(
shape, # 张量的尺寸
mean=0.0, # 均值
stddev=1.0, # 标准差
dtype=tf.dtypes.float32, # 数据类型
seed=None, # 随机种子
name=None # 当前操作的名称
)
接下来我们举例说明 tf.random_normal()
方法的具体用法:
rand = tf.random.normal(shape=[3, 2], mean=10, stddev=2, dtype=tf.float32)
print(rand)
上述代码运行结果为:
tf.Tensor(
[[10.195816 10.8105135]
[11.396963 8.74386 ]
[ 7.5644026 7.6055307]], shape=(3, 2), dtype=float32)
生成均匀分布张量
我们可以通过 tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32)
方法来生成一个采样区间为 [minval, maxval]
均匀分布张量:
uni_tensor = tf.random.uniform([2, 2])
print(uni_tensor)
上述代码运行结果为:
tf.Tensor(
[[0.8326764 0.01370859]
[0.52975047 0.45894718]], shape=(2, 2), dtype=float32)
上述代码生成了采样区间为 [0, 1)
和尺寸为 (2, 2)
的均匀分布张量,其中 minval
和 maxval
默认值为 0
和 1
,dtype
默认值为 32
位浮点数。
创建连续张量序列
有时候我们需要创建一段连续的数值序列,就可以利用 tf.range()
方法来实现,该方法的原型如下所示:
tf.range(limit, delta=1, dtype=None, name='range')
# 或
tf.range(start, limit, delta=1, dtype=None, name='range')
该方法类似于 Python 的内置函数 range()
,tf.range(n)
等效于 tf.range(0, n)
,其功能就是生成范围为 [0, n)
,步长为 1
的序列。这里的 n
表示上限 limit
,取值区间左闭右开,即最大值 limit
无法取到。
若起始值 start
不是默认值 0
,则需要手动设置 start
参数的值,我们来看一个例子:
range_a = tf.range(10) # 返回区间为 [0, 10),步长为 1 的整数序列
print(range_a)
上述代码运行结果为:
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
range_b = tf.range(start=3, limit=18, delta=3) # 返回区间为 [3, 18),步长为 3 的整数序列
print(range_b)
上述代码运行结果为:
tf.Tensor([ 3 6 9 12 15], shape=(5,), dtype=int32)
range_c = tf.range(3, 18, 0.5) # 返回区间为 [3, 18),步长为 0.5 的浮点数序列
print(range_c)
上述代码运行结果为:
tf.Tensor(
[ 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5
10. 10.5 11. 11.5 12. 12.5 13. 13.5 14. 14.5 15. 15.5 16. 16.5
17. 17.5], shape=(30,), dtype=float32)