Tensorflow2

创建数据

详细讲解一下 TensorFlow 创建数据的集中方法.

创建常量

tf.constant() 格式为:

  1. tf.constant(valuedtypeshapename)

参数:

  • value: 常量值
  • dtype: 数据类型
  • shape: 表示生成常量数的维度
  • name: 数据名称

例子:

  1. # 创建常量1
  2. c1 = tf.constant(1)
  3. print(c1)
  4. # 创建常量, 类型为bool
  5. c2 = tf.constant([True, False])
  6. print(c2)
  7. # 创建常量1, 类型为float32, 大小为3*3
  8. c3 = tf.constant(0.1, shape=[2, 2])
  9. print(c3)
  10. # 创建常量, 类型为string字符串
  11. c4 = tf.constant("Hello World!")
  12. print(c4)

输出结果:

  1. tf.Tensor(1, shape=(), dtype=int32)
  2. tf.Tensor([ True False], shape=(2,), dtype=bool)
  3. tf.Tensor(
  4. [[0.1 0.1]
  5. [0.1 0.1]], shape=(2, 2), dtype=float32)
  6. tf.Tensor(b'Hello World!', shape=(), dtype=string)

创建数据序列

格式:

  1. range(start, limit, delta=1, dtype=None, name='range')

参数:

  • start: 开始位置
  • limit: 序列的上限
  • delta: 相当于 Numpy 的 step, 步长
  • detype: 数据类型
  • name: 数据名称, 默认为 “range

例子:

  1. # 创建数字序列
  2. r1 = tf.range(4)
  3. print(r1)

输出结果:

  1. tf.Tensor([0 1 2 3], shape=(4,), dtype=int32)

创建图变量

格式:

  1. tf.Variable.init(initial_value, trainable=True, collections=None, validate_shape=True, name=None)

参数:

参数名称 参数类型 参数含义
initial_value 所有可以转换为 Tensor 的类型 变量的初始值
trainable bool 如果为 True, 会把它加入到 GraphKeys.TRAINABLE_VARIABLES, 才能对它使用 Optimizer |collections|list|指定该图变量的类型, 默认为 [GraphKeys.GLOBAL_VARIABLES]
validate_shape bool 如果为 False, 则不进行类型和维度检查
name string 数据名称

例子:

  1. # 创建图变量
  2. v1 = tf.Variable(tf.range(6))
  3. print(v1)
  4. print(isinstance(v1, tf.Tensor)) # False
  5. print(isinstance(v1, tf.Variable)) # True
  6. print(tf.is_tensor(v1)) # True

输出结果:

  1. False
  2. True
  3. True

tf.zeros

tf.zeros 可以创建一个所有参数为 0 的 tensor 对象, 类似于 np.zeros.
格式:

  1. tf.zeros(shape, dtype=tf.dtypes.float32, name=None)

参数:

  • shape: 数组的形状
  • dype: 数据类型, 默认为 float32
  • name: 数据名称

例子:

  1. # 创建参数为0的tensor
  2. z1 = tf.zeros([1])
  3. print(z1)
  4. z2 = tf.zeros([3, 3])
  5. print(z2)

输出结果:

  1. tf.Tensor([0.], shape=(1,), dtype=float32)
  2. tf.Tensor(
  3. [[0. 0. 0.]
  4. [0. 0. 0.]
  5. [0. 0. 0.]], shape=(3, 3), dtype=float32)

tf.ones

tf.ones 用法和 tf.zeros 一样, 可以创建一个所有参数为 1 的 tensor 对象.

  1. tf.ones(shape, dtype=tf.dtypes.float32, name=None)

参数:

  • shape: 数组的形状
  • dype: 数据类型, 默认为 float32
  • name: 数据名称

例子:

  1. # 创建参数为1的tensor
  2. o1 = tf.ones([1])
  3. print(o1)
  4. o2 = tf.ones([3, 3])
  5. print(o2)

输出结果:

  1. tf.Tensor([1.], shape=(1,), dtype=float32)
  2. tf.Tensor(
  3. [[1. 1. 1.]
  4. [1. 1. 1.]
  5. [1. 1. 1.]], shape=(3, 3), dtype=float32)

tf.zeros_like

tf.zeros_like 可以创建一个与给定 tensor 类型大小一致的 tensor, 类似 np.zeros_like.
格式:

  1. tf.zeros_like(tensor, dype=None, name=None)

参数:

  • tensor: 传入的 tensor
  • dype: 数据类型, 默认为 float32
  • name: 数据名称

例子:

  1. # tf.zeros_like
  2. t1 = tf.range(6)
  3. z1 = tf.zeros_like(t1)
  4. print(z1)

输出结果:

  1. tf.Tensor([0 0 0 0 0 0], shape=(6,), dtype=int32)

tf.ones_like

格式:

  1. tf.ones_like(tensor, dype=None, name=None)

参数:

  • tensor: 传入的 tensor
  • dype: 数据类型, 默认为 float32
  • name: 数据名称

例子:

  1. # tf.ones_like
  2. t1 = tf.range(6)
  3. o1 = tf.ones_like(t1)
  4. print(o1)

输出结果:

  1. tf.Tensor([1 1 1 1 1 1], shape=(6,), dtype=int32)

tf.fill

tf.fill 可以创建一个指定形状和内容的 tensor.
格式:

  1. tf.fill(shape, value, name=None)

参数:

  • shape: 数组的形状
  • value: 填充的值
  • name: 数据名称

例子:

  1. # tf.fill
  2. f1 = tf.fill([2, 2], 0)
  3. print(f1)
  4. f2 = tf.fill([3, 3], 6)
  5. print(f2)

输出结果:

  1. [[0 0]
  2. [0 0]], shape=(2, 2), dtype=int32)
  3. tf.Tensor(
  4. [[6 6 6]
  5. [6 6 6]
  6. [6 6 6]], shape=(3, 3), dtype=int32)

tf.gather

tf.gather: 根据索引从参数轴收集切片.
格式:

  1. tf.gather(
  2. params, indices, validate_indices=None, axis=None, batch_dims=0, name=None
  3. )

参数:

  • params: 传入的张量
  • indices: A Tensor.types 必须是: int32, int64.里面的每一个元素大小必须在 [0, params.shape[axis]) 范围内
  • axis: 维度, 默认为 0 例子:

    1. input =[ [[[1, 1, 1], [2, 2, 2]],
    2. [[3, 3, 3], [4, 4, 4]],
    3. [[5, 5, 5], [6, 6, 6]]],
    4. [[[7, 7, 7], [8, 8, 8]],
    5. [[9, 9, 9], [10, 10, 10]],
    6. [[11, 11, 11], [12, 12, 12]]],
    7. [[[13, 13, 13], [14, 14, 14]],
    8. [[15, 15, 15], [16, 16, 16]],
    9. [[17, 17, 17], [18, 18, 18]]]
    10. ]
    11. output=tf.gather(input, [0,2],axis=0)

    输出结果: ```python tf.Tensor( [[[[ 1 1 1] [ 2 2 2]]

    [[ 3 3 3] [ 4 4 4]]

    [[ 5 5 5] [ 6 6 6]]]

[[[13 13 13] [14 14 14]]

[[15 15 15] [16 16 16]]

[[17 17 17] [18 18 18]]]], shape=(2, 3, 2, 3), dtype=int32)

  1. <a name="brSxE"></a>
  2. ### `tf.random`
  3. <a name="Pfw3V"></a>
  4. #### 正态分布
  5. `tf.random.normal` 可以创建随机数服从正态分布.<br />格式:
  6. ```python
  7. tf.random.normal(
  8. shape, mean=0.0, stddev=1.0, dtype=tf.dtypes.float32, seed=None, name=None
  9. )

参数:

  • shape: 张量的形状
  • mean: 正态分布的均值, 默认为 0.0
  • stddev: 正态分布的标准差, 默认为 1.0
  • dtype: 数据类型, 默认为 float32
  • seed: 随机数种子
  • name: 数据名称

例子:

  1. # tf.normal
  2. n1 = tf.random.normal([2, 2], mean = 1, stddev=1, seed=0)
  3. print(n1)

输出结果:

  1. tf.Tensor(
  2. [[0.60084236 3.1044393 ]
  3. [1.1710722 1.5465181 ]], shape=(2, 2), dtype=float32)

均匀分布

tf.random.uniform 可以创建随机数服从均匀分布.格式:

  1. tf.random.uniform(
  2. shape, minval=0, maxval=None, dtype=tf.dtypes.float32, seed=None, name=None
  3. )

参数:

  • shape: 张量的形状
  • minval: 均匀分布的最小值, 默认为 0
  • maxvak: 均匀分布的最大值
  • dtype: 数据类型, 默认为 float32
  • seed: 随机数种子
  • name: 数据名称

例子:

  1. # tf.uniform
  2. u1 = tf.random.uniform([2, 2], minval=0, maxval=1)
  3. print(u1)

输出结果:

  1. tf.Tensor(
  2. [[0.7382153 0.6622821 ]
  3. [0.22840345 0.09706533]], shape=(2, 2), dtype=float32)

打乱顺序

tf.random.shuffle 可以打乱张量的顺序.
格式:

  1. tf.random.shuffle(
  2. value, seed=None, name=None
  3. )

参数:

  • value: 要被打乱的张量
  • seed: 随机数种子
  • name: 数据名称

例子:

  1. # tf.shuffle
  2. s1 = tf.random.shuffle(tf.range(10))
  3. print(s1)

输出结果:

  1. tf.Tensor([1 7 3 9 2 6 8 5 4 0], shape=(10,), dtype=int32)

获取数据信息

获取数据维度

tf.rank 的用法和 np.ndim 基本一样.
格式:

  1. rank(input, name=None) # 类似np.ndim

参数:

  • input: 传入的张量
  • name: 数据名称

例子:

  1. # 获取张量维度
  2. t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
  3. print(tf.rank(t))

输出结果:

  1. tf.Tensor(3, shape=(), dtype=int32)

数据是否为张量

格式:

  1. tf.is_tensor(input)

参数:

  • input: 传入的张量

例子:

  1. # 判断是否为张量
  2. a = tf.constant([1, 2, 3])
  3. b = tf.constant([True, False, False])
  4. c = tf.constant("Hello World")
  5. d = np.arange(6)
  6. print(a)
  7. print(tf.is_tensor(a))
  8. print(b)
  9. print(tf.is_tensor(b))
  10. print(c)
  11. print(tf.is_tensor(c))
  12. print(d)
  13. print(tf.is_tensor(d))

输出结果:

  1. tf.Tensor([1 2 3], shape=(3,), dtype=int32)
  2. True
  3. tf.Tensor([ True False False], shape=(3,), dtype=bool)
  4. True
  5. tf.Tensor(b'Hello World', shape=(), dtype=string)
  6. True
  7. [0 1 2 3 4 5]
  8. False

数据转换

转换成张量

格式:

  1. tf.convert_to_tensor(value, dtype=None, dtype_hint=None, name=None)

参数:

  • value: 需要转换的值
  • dtype: 数据类型
  • dtype_hint: 当 dtype 为 None 时的备选方案
  • name: 数据名称

例子:

  1. # 转换成张量
  2. array = np.arange(6)
  3. print(array.dtype)
  4. array_tf = tf.convert_to_tensor(array)
  5. print(array_tf)

输出结果:

  1. int32
  2. tf.Tensor([0 1 2 3 4 5], shape=(6,), dtype=int32)

转换数据类型

格式:

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

参数:

  • x: 输入的值
  • dtype: 数据类型
  • name: 数据名称

例子:

  1. # 装换数据类型
  2. array_tf = tf.constant(np.arange(6))
  3. print(array_tf)
  4. array_tf = tf.cast(array_tf, dtype=tf.float32)
  5. print(array_tf)
  6. tf_bool = tf.cast(tf.constant([False, True]), dtype=tf.int32)
  7. print(tf_bool)

输出结果:

  1. tf.Tensor([0 1 2 3 4 5], shape=(6,), dtype=int32)
  2. tf.Tensor([0. 1. 2. 3. 4. 5.], shape=(6,), dtype=float32)
  3. tf.Tensor([0 1], shape=(2,), dtype=int32)

转换成 numpy

例子:

  1. # tensor转换成numpy
  2. array_tf = tf.ones([2,2])
  3. array_np = array_tf.numpy()
  4. print(array_np)

输出结果:

  1. [[1. 1.]
  2. [1. 1.]]