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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


MNIST数据集可以说是深度学习的入门,但是使用模型预测单张MNIST图片得到数字识别结果的文章不多,所以本人查找资料,把代码写下,希望可以帮到大家~1#BudingyourfirstimageclassificationmodelwithMNISTdataset2importtensorflowastf3importnumpyasnp4impor
1、新建tensorflow环境(1)打开anacondaprompt,输入命令行condacreate-ntensorflowpython=3.6注意:尽量不要更起名字,不然环境容易出错在选择是否安装时输入“y”(即为“yes”)。其中tensorflow为新建的虚拟环境名称,可以按喜好自由选择。python=3.6为指定python版本为3
这篇文章主要介绍“张量tensor是什么”,在日常操作中,相信很多人在张量tensor是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
tensorflow中model.fit()用法model.fit()方法用于执行训练过程model.fit(训练集的输入特征,训练集的标签,batch_size,#每一个batch的大小epochs,#迭代次数validation_data=(测试集的输入特征,
https://blog.csdn.net/To_be_little/article/details/124438800 目录1、查看GPU的数量2、设置GPU加速3、单GPU模拟多GPU环境1、查看GPU的数量importtensorflowastf#查看gpu和cpu的数量gpus=tf.config.experimental.list_physical_devices(device_type='GPU')cpus=tf.c
根据身高推测体重const$=require('jquery');consttf=require('@tensorflowfjs');consttfvis=require('@tensorflowfjs-vis');/*根据身高推测体重*///把数据处理成符合模型要求的格式functiongetData(){//学习数据constheights=[150,151,160,161,16
#!/usr/bin/envpython2#-*-coding:utf-8-*-"""CreatedonThuSep610:16:372018@author:myhaspl@email:myhaspl@myhaspl.com二分法求解一元多次方程"""importtensorflowastfdeff(x):y=pow(x,3)*3+pow(x,2)*2-19return
 继续上篇的pyspark集成后,我们再来看看当今热的不得了的tensorflow是如何继承进pycharm环境的参考:http://blog.csdn.net/include1224/article/details/53452824思路其实很简单,说下要点吧1.python必须要3.564位版本(上一篇直接装的是64位版本的Anaconda)2.激活3.5版本的
首先要下载python3.6:https://www.python.org/downloadselease/python-361/接着下载:numpy-1.13.0-cp36-none-win_amd64.whl 安装这两个:安装python3.6成功,接着安装numpy.接着安装tensorflow: 最后测试一下: python3.6+tensorflow安装完毕,高深的AI就等着你去
参考书《TensorFlow:实战Google深度学习框架》(第2版)以下TensorFlow程序完成了从图像片段截取,到图像大小调整再到图像翻转及色彩调整的整个图像预处理过程。#!/usr/bin/envpython#-*-coding:UTF-8-*-#coding=utf-8"""@author:LiTian@contact:694317828@qq.com
参考:TensorFlow在windows上安装与简单示例写在开头:刚开始安装的时候,由于自己的Python版本是3.7,安装了好几次都失败了,后来发现原来是tensorflow不支持3.7版本的python,所以后来换成了Python3.6,就成功了。。。。。anconda:5.3.2python版本:3.6.8tensorflow版本:1.12.0安装Anconda
实验介绍数据采用CriteoDisplayAds。这个数据一共11G,有13个integerfeatures,26个categoricalfeatures。Spark由于数据比较大,且只在一个txt文件,处理前用split-l400000train.txt对数据进行切分。连续型数据利用log进行变换,因为从实时训练的角度上来判断,一般的标准化方式,
 1)登录需要一个 invitationcode,申请完等邮件吧,大概要3-5个小时;2)界面3)配置数据集,在右边列设置 
模型文件的保存tensorflow将模型保持到本地会生成4个文件:meta文件:保存了网络的图结构,包含变量、op、集合等信息ckpt文件:二进制文件,保存了网络中所有权重、偏置等变量数值,分为两个文件,一个是.data-00000-of-00001文件,一个是.index文件checkpoint文件:文本文件,记录了最新保持
原文地址:https://blog.csdn.net/jesmine_gu/article/details/81093686这里只是做个收藏,防止原链接失效importosimportnumpyasnpfromPILimportImageimporttensorflowastfimportmatplotlib.pyplotaspltangry=[]label_angry=[]disgusted=[]label_d
 首先声明参考博客:https://blog.csdn.net/beyond_xnsx/article/details/79771690?tdsourcetag=s_pcqq_aiomsg实践过程主线参考这篇博客,相应地方进行了变通。接下来记载我的实践过程。  一、GPU版的TensorFlow的安装准备工作:笔者电脑是Windows10企业版操作系统,在这之前已
1.tensorflow安装  进入AnacondaPrompt(windows10下按windows键可找到)a.切换到创建好的tensorflow36环境下:activatetensorflow36    b.安装tensorflow:pipinstlltensorflow    c.测试环境是否安装好       看到已经打印出了"h
必须走如下步骤:sess=tf.Session()sess.run(result)sess.close()才能执行运算。Withtf.Session()assess:Sess.run()通过会话计算结果:withsess.as_default():print(result.eval())表示输出result的值生成一个权重矩阵:tf.Variable(tf.random_normal([2,3]
tf.zeros函数tf.zeros(shape,dtype=tf.float32,name=None)定义在:tensorflow/python/ops/array_ops.py.创建一个所有元素都设置为零的张量. 该操作返回一个带有形状shape的类型为dtype张量,并且所有元素都设为零.例如:tf.zeros([3,4],tf.int32)#[[0,0,
一、Tensorflow基本概念1、使用图(graphs)来表示计算任务,用于搭建神经网络的计算过程,但其只搭建网络,不计算2、在被称之为会话(Session)的上下文(context)中执行图3、使用张量(tensor)表示数据,用“阶”表示张量的维度。关于这一点需要展开一下       0阶张量称