TensorFlow张量Tensor

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensorFlow张量Tensor相关的知识,希望对你有一定的参考价值。

学习目标

  • 目标
    • 知道常见的TensorFlow创建张量
    • 知道常见的张量数学运算操作
    • 说明numpy的数组和张量相同性
    • 说明张量的两种形状改变特点
    • 应用set_shape和tf.reshape实现张量形状的修改
    • 应用tf.matmul实现张量的矩阵运算修改
    • 应用tf.cast实现张量的类型
  • 应用
  • 内容预览
    • 张量(Tensor)
      • 1 张量的类型
      • 2 张量的阶
    • 创建张量的指令
      • 固定值张量
      • 随机值张量
    • 张量的变换
      • 1 类型改变
      • 2 形状改变
    • 张量的数学运算

在编写 TensorFlow 程序时,程序传递和运算的主要目标是tf.Tensor

1. 张量(Tensor)

TensorFlow 的张量就是一个 n 维数组, 类型为tf.Tensor。Tensor具有以下两个重要的属性

  • type:数据类型
  • shape:形状(阶)

1.1 张量的类型

1.2 张量的阶

形状有0阶、1阶、2阶….

tensor1 = tf.constant(4.0)
tensor2 = tf.constant([1, 2, 3, 4])
linear_squares = tf.constant([[4], [9], [16], [25]], dtype=tf.int32)

print(tensor1.shape)
# 0维:()   1维:(10, )   2维:(3, 4)   3维:(3, 4, 5)

2. 创建张量的指令

  • 固定值张量

  • 随机值张量

  • 其它特殊的创建张量的op
    • tf.Variable
    • tf.placeholder

3. 张量的变换

3.1 类型改变

3.2 形状改变

TensorFlow的张量具有两种形状变换,动态形状和静态形状

  • tf.reshape
  • tf.set_shape

关于动态形状和静态形状必须符合以下规则

  • 静态形状
    • 转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形状
    • 对于已经固定的张量的静态形状的张量,不能再次设置静态形状
  • 动态形状
    • tf.reshape()动态创建新张量时,张量的元素个数必须匹配
def tensor_demo():
    """
    张量的介绍
    :return:
    """
    a = tf.constant(value=30.0, dtype=tf.float32, name="a")
    b = tf.constant([[1, 2], [3, 4]], dtype=tf.int32, name="b")
    a2 = tf.constant(value=30.0, dtype=tf.float32, name="a2")
    c = tf.placeholder(dtype=tf.float32, shape=[2, 3, 4], name="c")
    sum = tf.add(a, a2, name="my_add")
    print(a, a2, b, c)
    print(sum)
    # 获取张量属性
    print("a的图属性:\\n", a.graph)
    print("b的名字:\\n", b.name)
    print("a2的形状:\\n", a2.shape)
    print("c的数据类型:\\n", c.dtype)
    print("sum的op:\\n", sum.op)

    # 获取静态形状
    print("b的静态形状:\\n", b.get_shape())

    # 定义占位符
    a_p = tf.placeholder(dtype=tf.float32, shape=[None, None])
    b_p = tf.placeholder(dtype=tf.float32, shape=[None, 10])
    c_p = tf.placeholder(dtype=tf.float32, shape=[3, 2])
    # 获取静态形状
    print("a_p的静态形状为:\\n", a_p.get_shape())
    print("b_p的静态形状为:\\n", b_p.get_shape())
    print("c_p的静态形状为:\\n", c_p.get_shape())

    # 形状更新
    # a_p.set_shape([2, 3])
    # 静态形状已经固定部分就不能修改了
    # b_p.set_shape([10, 3])
    # c_p.set_shape([2, 3])
    
    # 静态形状已经固定的部分包括它的阶数,如果阶数固定了,就不能跨阶更新形状
    # 如果想要跨阶改变形状,就要用动态形状
    # a_p.set_shape([1, 2, 3])
    # 获取静态形状
    print("a_p的静态形状为:\\n", a_p.get_shape())
    print("b_p的静态形状为:\\n", b_p.get_shape())
    print("c_p的静态形状为:\\n", c_p.get_shape())

    # 动态形状
    # c_p_r = tf.reshape(c_p, [1, 2, 3])
    c_p_r = tf.reshape(c_p, [2, 3])
    # 动态形状,改变的时候,不能改变元素的总个数
    # c_p_r2 = tf.reshape(c_p, [3, 1])
    print("动态形状的结果:\\n", c_p_r)
    # print("动态形状的结果2:\\n", c_p_r2)
    return None

4. 张量的数学运算

  • 算术运算符
  • 基本数学函数
  • 矩阵运算
  • reduce操作
  • 序列索引操作

详细请参考: https://www.tensorflow.org/versions/r1.8/api_guides/python/math_ops

这些API使用,我们在使用的时候介绍,具体参考文档

以上是关于TensorFlow张量Tensor的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow张量Tensor

AI - TensorFlow Tensor

张量(tensor)的阶、形状、数据类型

如何在tensorflow中判断tensor(张量)的值

tensorflow中张量(tensor)的属性——维数(阶)形状和数据类型

LSTM和tensor张量