TensorFlow常用张量生成方法

TensorFlow常用张量生成方法

常用张量生成方法

生成全 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) 的均匀分布张量,其中 minvalmaxval 默认值为 01dtype 默认值为 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)

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://cangmang.xyz/articles/tensorflow-usual-tensor-created-methods