tensorflow 一些概念

原文链接: tensorflow 一些概念

上一篇: Python 矩阵转图片

下一篇: 基础算法

为什么  c = tf.matmul(a, b) 不立即执行矩阵相乘?
在 TensorFlow 的 Python API 中, a , b , and c 都是 Tensor 对象. 一个 Tensor 对象是一个操作(ope
ration)结果的字符别名,它实际上并不储存操作(operation)输出结果的值。 TensorFlow 鼓励用户去建立复杂的
表达式(如整个神经网络及其梯度)来形成 data flow graph 。 然后你可以将整个 data flow graph 的计算过
程交给一个 TensorFlow 的 Session , 此 Session 可以运行整个计算过程,比起操作(operations)一条一条的
执行效率高的多。

请详细解释 feeding 和 placeholders?
Feeding 是 TensorFlow Session API 的一种机制,它允许你在运行时用不同的值替换一个或多个 tensor 的
值。 Session.run() 的参数 feed_dict 是一个字典, 它将 Tensor 对象映射为 numpy 的数组(和一些其他
类型)。 在执行 step 时,这些数组就是 tensor 的值。
你常会碰到某些 tensor 总是有值的,比如 inputs。 tf.placeholder() 操作(operation)允许你定义一种必须
提供值的 tensor ,你也可以随意限定它们的 shape。关于如何使用 placelolders 和 feeding 为神经网络提供
训练数据的例子,请参看初学者的 MNIST 教程
Session.run() 和 Tensor.eval() 有什么区别?
如果 t 是一个 Tensor 对象, t.eval() 就是 sess.run(t) ( sess 是当前默认 session)的简写。 以
下两段小程序是等效的:
# 使用 `Session.run()`.
sess = tf.Session()
c = tf.constant(5.0)
print sess.run(c)
# 使用 `Tensor.eval()`.
c = tf.constant(5.0)
with tf.Session():
print c.eval()
在第二个例子中, session 的作用就象 context manager , context manager 在 with 块的生存期,将 sess
ion 作为默认的 session。对简单应用的情形(如单元测试),context manager 的方法可以得到更简洁的代
码; 如果你的代码要处理多个 graph 和 session ,更直白的方式可能是显式调用 Session.run() 。
第 4 章 资源 | 163
Sessions 有生存期吗? 调用时产生的 tensors 呢?
Session 能够占有资源,例如 variables,queues, 和 readers; 这些资源会使用相当大量的内存。 当调用 Sess
ion.close() 关闭 session 后,这些资源(和相关的内存)就被释放了。
作为调用 Session.run() 过程的一部分所创建的 tensors, 会在调用时或调用结束前释放。
我可以在多个计算机上运行分布式的训练吗?
最初的 TensorFlow 开源版本支持单一计算机内的多设备(CPUs 和 GPUs)。 我们也正在致力于一个分布式的版
本:如果你有兴趣,请告知我们,这样我们可以做相应的调整。
运行时会并行计算图的执行的各个部分(parts of graph execution)吗?
TensorFlow 运行时会在许多不同的层面(dimensions)并行图的执行(graph execution):
• 在一个CPU中用多核或是一个GPU中用多线程来并行许多单独的操作(operation)。
• 在 TensorFlow graph 中各个独立的节点可以在多个设备上并行,这样就提供了加速的可能。CIFAR-10 用多
GPU 训练.
• Session API 允许并行执行多并发的 steps (如 调用 Session.run())。 如果单一的 step 不使用你计算
机中所有的资源,这种方法可以使运行时有更高的吞吐量。
TensorFlow 支持哪些客户端编程语言?
TensorFlow 被设计成为支持多种客户端语言。当前支持最好的客户端语言是 Python。 C++ 客户端 API 提供了
启动 graph 和运行 steps 的接口; 我们还有一个 用 C++ 建立 graph 的 API,此 API 是实验性的。
从社区的利益出发,我们想要支持更多的客户端语言。 TensorFlow 有一个 基于 C 的客户端 API,它使得用许
多不同的语言创建客户端变得很容易。我们请大家在新语言绑定上做出努力。
TensorFlow 会利用我计算机上所有可用的设备(GPUs 和 CPUs)吗?
TensorFlow 支持多 GPU 和 CPU。 有关 TensorFlow 如何将操作(operations)分配到设备的细节请参看 TensorF
low 如何使用 GPUs 的文档,有关使用多 GPU 的示范实例请参看 CIFAR-10 教程
请注意, TensorFlow 只使用计算能力(compute capability)大于 3.5 的 GPU 设备。
当使用一个 reader 或 一个 queue 时,为什么 Session.run() 会挂起?
reader 类和 queue 类提供特殊的操作(operations),这些操作(operations)在有可用的输入(对有界队列则是空
闲空间)前会 阻塞 。使用这些操作(operations)你可以创建复杂的输入流水线(input pipelines) ,不过,这会
使 TensorFlow 的计算过程更复杂。有关如何使用这些操作(operations)的更多信息请参看 how-to 文档中的使
用 QueueRunner 对象来控制 queues 和 readers。

Variables
参看 Variables 和 变量作用域 的 how-to 文档,还有关于变量的 API 文档
变量的生存期是?
在某一 session 中,当你一开始运行 tf.Variable.initializer 操作(operation)时,变量就会被创建。此 se
ssion 关闭后 它就被摧毁(destroyed)了。
并发读取或存入变量时会是什么情况?
变量可以进行并发的读和写操作(operation)。由于变量是并发(concurrently)更新的, 所以从一个变量中读出
的值可能会改变。在不互斥的条件下,对一个变量的并发的许多赋值操作(operation)是默认允许运行的。在对一
个变量赋值时,如果想要加锁,可以将 use_locking=True 传递给 Variable.assign() 。
Tensor shapes
参看 TensorShape API 文档.
在 Python 中我怎么判断一个 tensor 的 shape ?
在 TensorFlow 中,一个 tensor 具备静态和动态两种 shape 。静态的 shape 可以用 tf.Tensor.get_shape()
方法读出:这种 shape 是由此 tensor 在创建时使用的操作(operations)推导得出的,可能是 partially compl
ete 的。如果静态 shape 没有完整定义(not fully defined)的话,则一个 tensor 的动态 shape 可通过求 t
f.shape(t) 的值得到。
x.set_shape() 和 x = tf.reshape(x) 有什么区别?
tf.Tensor.set_shape() 方法(method)会更新(updates)一个 Tensor 对象的静态 shape ,当静态 shape 信息
不能够直接推导得出的时候,此方法常用来提供额外的 shape 信息。它不改变此 tensor 动态 shape 的信息。
tf.reshape() 操作(operation)会以不同的动态 shape 创建一个新的 tensor。
我怎么创建这样一个 graph ,它在批次大小可变(variable batch sizes)的情形下也可以正常运作?
如果能够创建一个 graph ,在批次大小可变(variable batch sizes)的情形下也可以正常运作将会是十分有用
的,例如可以使用相同的代码完成(小)批量训练((mini-)batch training)和单例推导(single-instance infer
ence)。这样生成的 graph 可以保存起来当作协议缓存(protocol buffer),也可以导入至其他的程序。
创建一个可变大小的 graph 时,要记住最重要的事情是不要将批次大小(batch size)编码成为 Python 常数,而
是用一个字符性(symbolic)的 Tensor 来表示。下面的提示可能会有用:
• 用 batch_size = tf.shape(input)[0] 从一个叫 input 的 Tensor 提取批次的维度(batch dimentio
n),再将其存入一个名为 batch_size 的 Tensor 。
第 4 章 资源 | 165
• 用 tf.reduce_mean() 而不是 tf.reduce_sum(...) / batch_size 。
• 如果你使用 placeholders for feeding input,你就可以用 tf.placeholder(..., shape=[None, ...]) 通
过创建 placeholder 来具体指定一个可变的批次维度(variable batch dimention)。shape 的 None 元素
与可变大小的维度(a variable-sized dimension)相对应。
TensorBoard
我怎样视觉化一个 TensorFlow graph ?
参看 graph 的视觉化教程.
向 TensorBoard 发送数据的最简单的方法是什么?
给你的 TensorFlow graph 增加 summary 操作(ops),接着用 SummaryWriter 将这些 summaries 写入一个 log
directory。然后用以下命令启动 TensorBoard 。
`python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory`
更多细节请参看 Summaries 和 TensorBoard 教程。
扩展 TensorFlow
参看有关向 TensorFlow 添加新操作(oprations) 的 how-to 文档。
我的数据是自定义格式,要怎样用 TensorFlow 来读取它?
有两种主要的操作(operation)来处理自定义格式的数据。
较简单的方法:用 Python 编写一段分词的代码(parsing code),将数据转换成为 numpy array,然后用此数据
把一个 [ tf.placeholder() ] (../api_docs/python/io_ops.md#placeholder) 传送给一个 tensor 。更多的细节
参见 使用 placeholders 进行输入 的相关文档。这个方法比较容易实现,不过分词的部分会成为性能的瓶颈。
更高效的方法是添加一个用 C++ 编写的操作(op),用这个操作(operation)来对你的数据格式进行分词(parse)。
新数据格式处理指南中有更多相关步骤的信息。
我如何定义操作(operation)使得它能够接受可变数量的输入?
TensorFlow 的操作(operation)注册机制允许你定义几种输入:单独的 tensor,一列相同类型的 tensors (例如
把一个可变长列表中的 tensors 相加), 一列不同类型的 tensors (例如将一个 tuple 中的 tensors 入队(enq
ueue))。有关怎样定义这些不同的输入类型的更多细节,请参看添加具有一列输入或输出的操作(op)的相关文
档。
第 4 章 资源 | 166
其他问题
TensorFlow 能使用 Python 3 吗?
我们只用 Python 2.7 进行了测试。我们了解对 Python 3 的兼容性来说,还需要有一些修改,欢迎大家朝这个
方向多努力。
TensorFlow 的代码风格有什么规则?
TensorFlow Python API 遵循 PEP8 惯例。
*
特别的,我们使用 CamelCase 格式作为类名, snake_case 格
式作为方程名, 方法名, 和属性名。我们也遵循 Google Python style guide。
TensorFlow C++ 代码遵循 Google C++ style guide。
( * 有一条例外: 我们使用 2 空格缩进而不是 4 空格缩进)
原文:[Frequently Asked Questionshref="http://tensorflow.org/resources/faq.md") 翻译:Terence Coope
r 校对:Wiki
第 4 章 资源 | 167
术语表
广播操作(Broadcasting operation)
一种用numpy-style broadcasting来保证tensor参数的形态兼容的操作。
Devices
一块可以用来运算并且拥有自己的地址空间的硬件,比如GPU和CPU。
eval
Tensor 的一个方法,返回 Tensor 的值。触发任意一个图计算都需要计算出这个值。只能在一个已经启动的会话
的图中才能调用该 Tensor 值。
Feed
TensorFlow 的一个概念:把一个 Tensor 直接连接到一个会话图表中的任意节点。feed 不是在构建图(graph)的
时候创建,而是在触发图的执行操作时去申请。一个 feed 临时替代一个带有 Tensor 值的节点。把feed数据作
为run( )方法和eval( )方法的参数来初始化运算。方法运行结束后,替换的 feed 就会消失,而最初的节点定义
仍然还在。可以通过tf.placeholder( )把特定的节点指定为 feed 节点来创建它们。详见[Basic Usagehref="ht
tps://github.com/jikexueyuanwiki/tensorflow-zh/blob/master/SOURCE/get_started/basic_usage.md").
Fetch
TensorFlow中的一个概念:为了取回运算操作的输出结果。取回的申请发生在触发执行图操作的时候,而不是发
生在建立图的时候。如果要取回一个或多个节点(node)的 Tensor 值,可以通过在 Session 对象上调用run(
)方法并将待取回节点(node)的列表作为参数来执行图表(graph)。详见[Basic Usagehref="https://github.co
m/jikexueyuanwiki/tensorflow-zh/blob/master/SOURCE/get_started/basic_usage.md")。
第 4 章 资源 | 168
Graph(图)
把运算任务描述成一个直接的无环图形(DAG),图表中的节点(node)代表必须要实现的一些操作。图中的边代
表数据或者可控的依赖。GratheDef 是系统中描述一个图表的协议(api),它由一个 NodeDefs 集合组成。一个Gr
aphDef可以转化成一个更容易操作的图表对象。
IndexedSlices(索引化切片)
在 Python API 中,TensorFlow 仅仅在第一维上对 Tensor 有所体现。如果一个 Tensor 有k维,那么一个 Inde
xedSlices 实例在逻辑上代表一个沿着这个 Tensor 第一维的(k-1)维切片的集合。切片的索引被连续储存在一个
单独的一维向量中,而对应的切片则被拼接成一个单独的k维 Tensor。如果 sparsity 不是受限于第一维空
间,请用 SparseTensor。
Node(节点)
图中的一个元素。 把启动一个特定操作的方式称为特定运算图表的一个节点,包括任何用来配置这个操作的属性
的值。对于那些多形态的操作,这些属性包括能完全决定这个节点(Node)签名的充分信息。详见graph.proto。
操作(Op/operation)
在 TensorFlow 的运行时中,它是一种类似 add 或 matmul 或 concat的运算。可以用[how to add an ophre
f="https://github.com/jikexueyuanwiki/tensorflow-zh/blob/master/SOURCE/how_tos/adding_an_op/index.m
d")中的方法来向运行时添加新的操作。
在 Python 的API中,它是图中的一个节点。在[tf.Operationhref="https://github.com/jikexueyuanwiki/tens
orflow-zh/blob/master/SOURCE/api_docs/python/framework.md")类中列举出了这些操作。一个操作(Operatio
n)的 type 属性决定这个节点(node)的操作类型,比如add和matmul。
Run
在一个运行的图中执行某种操作的行为。要求图必须运行在会话中。
在 Python 的 API 中,它是 Session 类的一个方法[tf.Session.runhref="https://github.com/jikexueyuanwi
ki/tensorflow-zh/blob/master/SOURCE/api_docs/python/client.md")。可以通过 Tensors 来订阅或获取run(
)操作。
第 4 章 资源 | 169
在C++的API中,它是[tensorflow::Sessionhref="https://github.com/jikexueyuanwiki/tensorflow-zh/blob/m
aster/SOURCE/api_docs/python/client.md")类 的一个方法。
Session(会话)
启动图的第一步是创建一个 Session 对象。Session 提供在图中执行操作的一些方法。
在 Python API中,使用[tf.Sessionhref="https://github.com/jikexueyuanwiki/tensorflow-zh/blob/master/
SOURCE/api_docs/python/client.md")。
在 C++ 的API中,[tensorflow::Sessionhref="https://github.com/jikexueyuanwiki/tensorflow-zh/blob/mas
ter/SOURCE/api_docs/cc/ClassSession.md")是用来创建一个图并运行操作的类:
Shape
Tensor 的维度和它们的大小。
在一个已经启动的图中,它表示流动在节点(node)之间的 Tensor 的属性。一些操作对 shape 有比较强的要
求,如果没有 Shape 属性则会报告错误。
在 Python API中,用创建图的 API 来说明 Tensor 的 Shape 属性。Tensor 的Shape 属性要么只有部分已
知,要么全部未知。详见[tf.TensroShapehref="https://github.com/jikexueyuanwiki/tensorflow-zh/blob/ma
ster/SOURCE/api_docs/python/framework.md")
在C++中,Shape 类用来表示 Tensor 的维度。[tensorflow::TensorShapehref="https://github.com/jikexueyu
anwiki/tensorflow-zh/blob/master/SOURCE/api_docs/cc/ClassTensorShape.md")。
SparseTensor
在 Python API 中,它用来表示在 TensorFlow 中稀疏散落在任意地方的 Tensor 。SparseTensor 以字典-值格
式来储存那些沿着索引的非空值。换言之,m个非空值,就包含一个长度为m的值向量和一个由m列索引(indice
s)组成的矩阵。为了提升效率,SparseTensor 需要将 indice(索引)按维度的增加来按序存储,比如行主
序。如果稀疏值仅沿着第一维度,就用 IndexedSlices。
Tensor
Tensor是一种特定的多维数组。比如,一个浮点型的四维数组表示一小批由[batch,height,width,channel]组
成的图片。
第 4 章 资源 | 170
在一个运行的图(graph)中,它是一种流动在节点(node)之间的数据。 在 Python 中,Tensor 类表示添加到图
的操作中的输入和输出,见[tf.Tensorhref="https://github.com/jikexueyuanwiki/tensorflow-zh/blob/maste
r/SOURCE/api_docs/python/framework.md"),这样的类不持有数据。
在C++中,Tensor是方法[Session::Run( )href="https://github.com/jikexueyuanwiki/tensorflow-zh/blob/ma
ster/SOURCE/api_docs/cc/ClassSession.md)的返回值,见tensorflow::Tensor,这样的 Tensor 持有数据。
原文:[Glossaryhref="https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/resource
s/glossary.md")
翻译:leege100
校对:lonlonago

张量的阶、形状、数据类型
TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一
个静态类型和动态类型的维数.张量可以在图中的节点之间流通.

在TensorFlow系统中,张量的维数来被描述为 阶 .但是张量的阶和矩阵的阶并不是同一个概念.张量的阶(有时是
关于如 顺序 或 度数 或者是 n维 )是张量维数的一个数量描述.比如,下面的张量(使用Python中list定义的)就是2
阶.
t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
你可以认为一个二阶张量就是我们平常所说的矩阵,一阶张量可以认为是一个向量.对于一个二阶张量你可以用语
句 t[i, j] 来访问其中的任何元素.而对于三阶张量你可以用't[i, j, k]'来访问其中的任何元素.
阶 阶  数学实例 Python 例子
0 纯量 (只有大小)
s = 483
1 向量(大小和方向)
v = [1.1, 2.2, 3.3]
2 矩阵(数据表)
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3 3阶张量 (数据立
体)
t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [1
8]]]
n n阶 (自己想想看)
....
形状
TensorFlow文档中使用了三种记号来方便地描述张量的维度:阶,形状以及维数.下表展示了他们之间的关系:
阶 形状 维数 实例
0 [ ] 0-D 一个 0维张量. 一个纯量.
1 [D0] 1-D 一个1维张量的形式[5].
2 [D0, D1] 2-D 一个2维张量的形式[3, 4].
3 [D0, D1, D2] 3-D 一个3维张量的形式 [1, 4, 3].
n [D0, D1, ... Dn] n-D 一个n维张量的形式 [D0, D1, ... Dn].
形状可以通过Python中的整数列表或元祖(int list或tuples)来表示,也或者用 TensorShape class.
第 4 章 资源 | 172
数据类型
除了维度,Tensors有一个数据类型属性.你可以为一个张量指定下列数据类型中的任意一个类型:
数据类型 Python 类型 描述
DT_FLOAT tf.float32
32 位浮点数.
DT_DOUBLE tf.float64
64 位浮点数.
DT_INT64 tf.int64
64 位有符号整型.
DT_INT32 tf.int32
32 位有符号整型.
DT_INT16 tf.int16
16 位有符号整型.
DT_INT8 tf.int8
8 位有符号整型.
DT_UINT8 tf.uint8
8 位无符号整型.
DT_STRING tf.string
可变长度的字节数组.每一个张量元素都是一个字节数组.
DT_BOOL tf.bool
布尔型.
DT_COMPLEX64 tf.complex64
由两个32位浮点数组成的复数:实数和虚数.
DT_QINT32 tf.qint32
用于量化Ops的32位有符号整型.
DT_QINT8 tf.qint8
用于量化Ops的8位有符号整型.
DT_QUINT8 tf.quint8
用于量化Ops的8位无符号整型.
原文:[Tensor Ranks, Shapes, and Typeshref="http://www.tensorflow.org/resources/dims_types.md")
翻译:nb312
校对:lonlonago

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值