TensorFlow低阶API(二)—— 张量

简介

正如名字所示,TensorFlow这一框架定义和运行涉及张量的计算。张量是对矢量和矩阵向潜在的更高维度的泛化。TensorFlow在内部将张量表示为基本数据类型的n维数组。

在编写TensorFlow程序时,您操作和传递的主要对象是 tf.Tensor。tf.Tensor对象表示一个部分定义的计算,最终会生成一个值。TensorFlow程序首先会构建一个tf.Tensor对象图,详细说明如何基于其它可用张量计算每个张量,然后运行运行改图的某些部分以获得期望的结果。

tf.Tensor具有以下属性:

  • 数据类型(例如float32、int32或string)
  • 形状

张量中的每个元素都具有相同的数据类型,且该数据类型一定是已知的。形状,即张量的维数和每个维度的大小,可能只有部分已知。如果其输入的形状也完全已知,则大多数操作会生成形状完全已知的张量,但在某些情况下,只能在执行图时获得张量的形状。

有些类型的张量有点特殊,TensorFlow指南的其它部分有所介绍。以下是主要特殊张量:

除了tf.Variable以外,张量的值是不变的,这意味着对于单个执行任务,张量只是一个值。然而,两次评估同一张量可能会返回不同的值。例如,该张量是从磁盘读取数据的结果,或是生成随机数的结果。

tf.Tensor对象的阶是它本身的维数。阶的同义词包括:秩、等级或n维。请注意,TensorFlow中的阶与数学中矩阵的阶并不是同一个概念。如下表所示,TensorFlow中的每个阶都对应一个不同的数学实例:

数学实例
0 标量(只有大小)
1 矢量(大小和方向)
2 矩阵(数据表)
3 3 阶张量(数据立体)
n n 阶张量(自行想象)

0阶

以下摘要演示了创建0阶变量的过程:

1 mammal = tf.Variable("Elephant", tf.string)
2 ignition = tf.Variable(451, tf.int16)
3 floating = tf.Variable(3.14159265359, tf.float64)
4 its_complicated = tf.Variable(12.3 - 4.85j, tf.complex64)

注意:字符串在 TensorFlow 中被视为单一项,而不是一连串字符。TensorFlow 可以有标量字符串,字符串矢量,等等。

1阶

要创建1阶tf.Tensor对象,您可以传递一个项目列表作为初始值。例如:

1 mystr = tf.Variable(["Hello"], tf.string)
2 cool_numbers  = tf.Variable([3.14159, 2.71828], tf.float32)
3 first_primes = tf.Variable([2, 3, 5, 7, 11], tf.int32)
4 its_very_complicated = tf.Variable([12.3 - 4.85j, 7.5 - 6.23j], tf.complex64)

更高阶

2阶tf.Tensor对象至少包含一行和一列:

1 mymat = tf.Variable([[7],[11]], tf.int16)
2 myxor = tf.Variable([[False, True],[True, False]], tf.bool)
3 linear_squares = tf.Variable([[4], [9], [16], [25]], tf.int32)
4 squarish_squares = tf.Variable([ [4, 9], [16, 25] ], tf.int32)
5 rank_of_squares = tf.rank(squarish_squares)
6 mymatC = tf.Variable([[7],[11]], tf.int32)

同样,更高阶的张量由一个n维数组组成。例如,在图像处理过程中,会使用许多4阶张量,维度对应批次大小、图像宽度、图像高度和颜色通道。

1 my_image = tf.zeros([10, 299, 299, 3])  # batch x height x width x color

获取tf.Tensor对象的阶

要确定tf.Tensor对象的阶,需要调用 tf.rank 方法。例如,以下方法会程序化的确定上一节中所定义的tf.Tensor的阶:

1 r = tf.rank(my_image)
2 # After the graph runs, r will hold the value 4.

引用tf.Tensor切片

由于tf.Tensor是n维单元数组,因此要访问tf.Tensor中的某一单元,需要指定n个索引。

0阶张量(标量)不需要索引,因为其本身就是单一数字。

对于1阶张量(矢量),可以通过传递一个索引访问某个数字:

1 my_scalar = my_vector[2]

请注意,如果想从矢量中动态的选择元素,那么在 [ ] 内传递的索引本身可以是一个标量tf.Tensor。

对于2阶及以上的张量,情况更为有趣。对于2阶tf.Tensor,传递两个数字会如预期般返回一个标量:

1 my_scalar = my_matrix[1, 2]

而传递一个数字则会返回矩阵子矢量,如下所示:

1 my_row_vector = my_matrix[2]
2 my_column_vector = my_matrix[:, 3]

符号 : 是python切片语法,意味“不要触碰该维度”。这对更高阶的张量来说很有用,可以帮助访问其子矢量,子矩阵,甚至其它子张量。

形状

张量的形状是每个维度中元素的数量。TensorFlow在图的构建中自动推理形状。这些推理的形状可能具有已知阶或未知阶。如果阶已知,则每个维度的大小可能已知或未知。

TensorFlow文件编制中通过三种符号约定来描述张量维度:阶、形状和维数。下表阐述了  三者如何相互关联:

形状 维数 示例
0 [] 0-D 0 维张量。标量。
1 [D0] 1-D 形状为 [5] 的 1 维张量。
2 [D0, D1] 2-D 形状为 [3, 4] 的 2 维张量。
3 [D0, D1, D2] 3-D 形状为 [1, 4, 3] 的 3 维张量。
n [D0, D1, ... Dn-1] n 维 形状为 [D0, D1, ... Dn-1] 的张量。

形状可以通过整形Python列表/元组或者 tf.TensorShape 表示。

获取tf.Tensor对象的形状

可以通过两种方法获取tf.Tensor的形状。在构建图的时候,询问有关张量形状的已知信息通常很有帮助。可以通过查看shape属性(属于tf.Tensor对象)获取这些信息。该方法会返回一个 TensorShape 对象,这样可以方便地表示部分指定的形状(因为在构建图的时候,并不是所有形状都完全已知)。

也可以获取一个将在运行时表示另一个tf.Tensor的完全指定形状的tf.Tensor。为此,可以调动 tf.shape 操作。如此以来,您可以构建一个图,通过构建其它取决于输入tf.Tensor的动态形状的张量来控制张量的形状。

例如,以下代码展示了如何创建大小与给定矩阵中的列数相同的零矢量

1 zeros = tf.zeros(my_matrix.shape[1])

改变tf.Tensor对象的形状

张量的元素数量是其所有形状大小的乘积。标量的元素数量永远是1。由于通常有许多不同的形状具有相同数量的元素,因此如果能改变tf.Tensor的形状并使其元素固定不变通常会很方便。为此,可以使用 tf.reshape

以下示例演示了如何重构张量:

 1 rank_three_tensor = tf.ones([3, 4, 5])
 2 matrix = tf.reshape(rank_three_tensor, [6, 10])  # Reshape existing content into
 3                                                  # a 6x10 matrix
 4 matrixB = tf.reshape(matrix, [3, -1])  #  Reshape existing content into a 3x20
 5                                        # matrix. -1 tells reshape to calculate
 6                                        # the size of this dimension.
 7 matrixAlt = tf.reshape(matrixB, [4, 3, -1])  # Reshape existing content into a
 8                                              #4x3x5 tensor
 9
10 # Note that the number of elements of the reshaped Tensors has to match the
11 # original number of elements. Therefore, the following example generates an
12 # error because no possible value for the last dimension will match the number
13 # of elements.
14 yet_another = tf.reshape(matrixAlt, [13, 2, -1])  # ERROR!

数据类型

除维度外,张量还具有数据类型。如需数据类型的完整列表,请参阅 tf.Dtype 页面。

一个tf.Tensor只能有一种数据类型。但是,可以将任意数据结构序列化为 string 并将其存储在tf.Tensor中。

可以将tf.Tensor从一种数据类型转型到另一种(通过 tf.cast ):

1 # Cast a constant integer tensor into floating point.
2 float_tensor = tf.cast(tf.constant([1, 2, 3]), dtype=tf.float32)

要检查tf.Tensor的数据类型,请使用 Tensor.dtype 属性。

用Python对象创建一个tf.Tensor时,可以选择指定数据类型。如果不指定数据类型,TensorFlow会选择一个可以表示您的数据的数据类型。TensorFlow会将Python整数转型为 tf.int32,并将Python浮点型转型为 tf.float32。此外,TensorFlow使用Numpy在转换至数组时使用的相同规则。

评估张量

计算图构建完毕后,您可以运行生成特定tf.Tensor的计算并获取分配给它们的值。这对于程序调试通过非常有帮助,也是TensorFlow的大部分功能正常运行所必需的。

评估张量最简单的方法是使用 Tensor.eval 方法。例如:

1 constant = tf.constant([1, 2, 3])
2 tensor = constant * constant
3 print(tensor.eval())

eval 方法仅在默认tf.Session处于活跃状态时才起作用。例如:

1 sess = tf.Session()
2
3 constant = tf.constant([1, 2, 3])
4 tensor = constant * constant
5 print(tensor.eval(session = sess))

Tensor.eval 会返回一个与张量相同的Numpy数组。

有时没法在没有背景信息的情况下评估tf.Tensor,因为它的值可能取决于无法获取的动态信息。例如,在没有为placehloder提供之的情况下,无法评估依赖于placeholder的张量:

1 p = tf.placeholder(tf.float32)
2 t = p + 1.0
3 t.eval()  # This will fail, since the placeholder did not get a value.
4 t.eval(feed_dict={p:2.0})  # This will succeed because we‘re feeding a value
5                            # to the placeholder.

请注意,可以提供任何tf.Tensor,而不仅仅是占位符。

其它模型构造可能会使评估tf.Tensor变得较为复杂。TensorFlow无法直接评估在函数内部或控制流结构内部定义的tf.Tensor。如果tf.Tensor取决于队列中的值,那么只有在某个项加入队列后才能评估tf.Tensor;否则。评估将被搁置。在处理队列时,请先调用 tf.train.start_queue_runners,在评估任何tf.Tensor。

输出张量

出于调试目的,您可能需要输出tf.Tensor的值。虽然 tfdbg 提供高级调试支持,但TensorFlow也有一个操作可以直接输出tf.Tensor的值。

请注意,输出tf.Tensor时很少使用以下模式:

1 t = <<some tensorflow operation>>
2 print(t)  # This will print the symbolic tensor when the graph is being built.
3           # This tensor does not have a value in this context.

上述代码会输出tf.Tensor对象(表示延迟计算),而不是其值。TensorFlow提供了 tf.Print 操作,该操作会返回其第一个张量参数(保持不变),同时输出第二个参数传递的tf.Tensor集合。

要正确使用tf.Print,必须使用其返回值。例如:

1 t = <<some tensorflow operation>>
2 tf.Print(t, [t])  # This does nothing
3 t = tf.Print(t, [t])  # Here we are using the value returned by tf.Print
4 result = t + 1  # Now when result is evaluated the value of `t` will be printed.

在评估result时,会评估所有影响result的元素。由于result依靠t,而评估t会导致输出其输入(t的旧值),所以系统会输出t。

参考链接:https://tensorflow.google.cn/guide/tensors#rank

原文地址:https://www.cnblogs.com/lfri/p/10359052.html

时间: 2024-08-26 12:45:31

TensorFlow低阶API(二)—— 张量的相关文章

spark streaming kafka1.4.1中的低阶api createDirectStream使用总结

转载:http://blog.csdn.net/ligt0610/article/details/47311771 由于目前每天需要从kafka中消费20亿条左右的消息,集群压力有点大,会导致job不同程度的异常退出.原来使用spark1.1.0版本中的createStream函数,但是在数据处理速度跟不上数据消费速度且job异常退出的情况下,可能造成大量的数据丢失.幸好,Spark后续版本对这一情况有了很大的改进,1.2版本加入WAL特性,但是性能应该会受到一些影响(本人未测试),1.3版本可

TensorFlow object detection API应用二

前一篇讲述了TensorFlow object detection API的安装与配置,现在我们尝试用这个API搭建自己的目标检测模型. 一.准备数据集 本篇旨在人脸识别,在百度图片上下载了120张张钧甯的图片,存放在/models/research/object_detection下新建的images文件夹内,images文件夹下新建train和test两个文件夹,然后将120分为100和20张分别存放在train和test中. 接下来使用 LabelImg 这款小软件,对train和test

谷歌开源的TensorFlow Object Detection API视频物体识别系统实现(二)[超详细教程] ubuntu16.04版本

本节对应谷歌开源Tensorflow Object Detection API物体识别系统 Quick Start步骤(一): Quick Start: Jupyter notebook for off-the-shelf inference 本节步骤较为简单,具体操作如下: 1.在第一节安装好jupyter之后,在ternimal终端进入到models文件夹目录下,执行命令: jupyter-notebook 2.会在网页打开Jupyter访问object_detection文件夹,进入obj

TensorFlow.org教程笔记(二) DataSets 快速入门

本文翻译自www.tensorflow.org的英文教程. tf.data 模块包含一组类,可以让你轻松加载数据,操作数据并将其输入到模型中.本文通过两个简单的例子来介绍这个API 从内存中的numpy数组读取数据. 从csv文件中读取行 基本输入 对于刚开始使用tf.data,从数组中提取切片(slices)是最简单的方法. 笔记(1)TensorFlow初上手里提到了训练输入函数train_input_fn,该函数将数据传输到Estimator中: def train_input_fn(fe

Tensorflow object detection API 搭建属于自己的物体识别模型

一.下载Tensorflow object detection API工程源码 网址:https://github.com/tensorflow/models,可通过Git下载,打开Git Bash,输入git clone https://github.com/tensorflow/models.git进行下载. 二.标记需要训练的图片 ①.在第一步下载的工程文件models\research\object_detection目录下,建立一个my_test_images用来放测试test和训练t

Civil 3D API二次开发学习指南

Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开发学习指南.另外,如果你用到Map 3D相关的功能,你还可能需要Map 3D的开发知识,看Map 3D API二次开发学习指南. 软件准备及开发环境 AutoCAD Civil 3D 软件,推荐2014以上版本,你可以从Autodesk 官方网站下载试用版, Visual Studio 2012 或

常用API二

常用API二一.Object 成员方法: 1.toString(): 重写前,调用object类中的,打印的是全类名@16进制的地址值 . 重写后打印具体对象的值 2.equals():重写前比较的是地址值 重写后打印的是具体属性值 3.获取字节码对象3种方式(三个获取的值相等) A:通过Object类中getClass()方法调用,Teacher t = new Teacher();t.getclass(); B:类名点调用 Teacher.class(); C:通过Class类的静态方法fo

TensorFlow object detection API

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_pets.md 1. 获取数据Oxford-IIIT Pets Dataset # From tensorflow/models/research/ wget http://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz wget http://www.robo

Install Tensorflow object detection API in Anaconda (Windows)

This blog is to explain how to install Tensorflow object detection API in Anaconda in Windows 10 as well as how to train train a convolution neural network to do object detection on your own data set. Steps: 1. Installation and Configuration Install