构建TensorFlow图
为什么不c = tf.matmul(a, b)
立即执行矩阵乘法?
在TensorFlow Python API a
中b
,,和,c
是 tf.Tensor
对象。一个Tensor
对象是一个象征性的手柄操作的结果,但实际上并不持有该操作的输出值。相反,TensorFlow鼓励用户建立复杂的表达(如整个神经网络及其渐变)作为数据流图。然后,将整个数据流图的计算(或其子图)卸载到TensorFlow中,该TensorFlow tf.Session
能够比执行逐个操作更有效地执行整个计算。
设备如何命名?
支持的设备名称是"/device:CPU:0"
(或"/cpu:0"
)用于CPU设备,"/device:GPU:i"
(或"/gpu:i"
)用于第i个GPU设备。
如何在特定的设备上进行操作?
要在设备上放置一组操作,请在with tf.device(name):
上下文中创建它们 。有关使用 TensorFlow的 GPU的操作方法文档,了解TensorFlow如何为设备分配操作的详细信息,以及使用多个GPU的示例模型的 CIFAR-10教程。
可用的不同类型的张量是什么?
TensorFlow支持各种不同的数据类型和张量形状。有关详细信息,请参阅 排名,形状和类型参考。
运行TensorFlow计算
与饲养和占位符有什么协议?
Feeding是TensorFlow Session API中的一种机制,允许您在运行时将不同的值替换为一个或多个张量。的feed_dict
到论点tf.Session.run
是,映射一个字典tf.Tensor
对象numpy的阵列(和一些其他类型的),其将被用作在步骤的执行那些张量的值。
通常,您会有一些始终被馈送的张量,如输入。的 tf.placeholder
运算允许定义该张量必须被馈送,并且可选地允许您约束它们的形状为好。参见 初学者的MNIST教程,了解如何使用占位符和馈送来提供神经网络的训练数据。
是有什么区别Session.run()
和Tensor.eval()
?
如果t
是一个tf.Tensor
对象, tf.Tensor.eval
是简写 tf.Session.run
(其中sess
是当前tf.get_default_session
的代码以下两个片段是等价的:
# Using `Session.run()`. sess = tf.Session() c = tf.constant(5.0) print(sess.run(c)) # Using `Tensor.eval()`. c = tf.constant(5.0) with tf.Session(): print(c.eval())
在第二个例子中,会话充当 上下文管理器,其作用是将其作为with
块的生命周期的默认会话进行安装。上下文管理器方法可以为简单的用例(如单元测试)提供更简洁的代码; 如果您的代码处理多个图形和会话,则可能会更直接地进行显式调用 Session.run()
。
会话有一生吗?中等张量呢?
会议可以根据自己的资源,如 tf.Variable
, tf.QueueBase
和 tf.ReaderBase
; 这些资源可以使用大量的内存。这些资源(和相关联的内存)在会话关闭时被释放,通过调用 tf.Session.close
。
作为呼叫的一部分创建的中间张量将在呼叫 Session.run()
结束时或之前被释放。
运行时并行执行图形执行的部分吗?
TensorFlow运行时可以跨许多不同的维度并行执行图形执行:
- 个人操作具有并行实现,在CPU中使用多个内核,或者在GPU中使用多个线程。
- TensorFlow图中的独立节点可以在多个设备上并行运行,这样可以使用多个GPU加速 CIFAR-10训练。
- 会话API允许多个并发步骤(即
tf.Session.run
并行调用), 这使得运行时可以获得更高的吞吐量,如果单步不使用计算机中的所有资源。
TensorFlow支持哪些客户端语言?
TensorFlow旨在支持多种客户端语言。目前,最受支持的客户端语言是Python。用于执行和构建图形的实验接口也可用于C ++,Java和Go。
TensorFlow还有一个 基于C的客户端API 来帮助构建更多客户端语言的支持。我们邀请新语言绑定的贡献。
TensorFlow是否使用我机器上可用的所有设备(GPU和CPU)?
TensorFlow支持多个GPU和CPU。有关使用 TensorFlow的 GPU的操作方法文档,了解TensorFlow如何为设备分配操作的详细信息,以及使用多个GPU的示例模型的 CIFAR-10教程。
请注意,TensorFlow仅使用计算能力大于3.5的GPU设备。
为什么Session.run()
在使用阅读器或队列时挂起?
的tf.ReaderBase
和 tf.QueueBase
类提供一种能够特别行动阻止直到输入(或自由空间中有界队列)变为可用。这些操作允许您构建复杂的 输入管道,以使TensorFlow计算更复杂一些。有关使用QueueRunner
对象驱动队列和读者 的更多信息,请参阅how-to文档 。
变量
变量的生命周期是多少?
当您tf.Variable.initializer
在会话中首次运行该变量的操作时,将创建一个变量 。当它被破坏tf.Session.close
。
变量在同时访问时的行为如何?
变量允许并发读写操作。如果同时更新,则从变量读取的值可能会更改。默认情况下,允许对变量进行并发分配操作,而不会互相排斥。要在分配变量时获取锁,请传递use_locking=True
给 tf.Variable.assign
。
张量形状
另见 tf.TensorShape
。
如何在Python中确定张量的形状?
在TensorFlow中,张量具有静态(推测)形状和动态(真实)形状。可以使用以下tf.Tensor.get_shape
方法读取静态形状 :该形状是从用于创建张量的操作推断的,可能 部分完成。如果静态形状没有完全定义,则Tensor
t
可以通过评估来确定a的动态形状tf.shape(t)
。
是有什么区别x.set_shape()
和x = tf.reshape(x)
?
该tf.Tensor.set_shape
方法更新Tensor
对象的静态形状,通常用于在不能直接推断的情况下提供其他形状信息。它不会改变张量的动态形状。
该tf.reshape
操作创建一个具有不同动态形状的新张量。
如何构建一个适用于可变批量大小的图表?
建立一个适用于可变批量大小的图表通常很有用,例如,可以使用相同的代码(mini-)批次训练和单实例推理。生成的图可以 保存为协议缓冲区 并 导入另一个程序。
构建可变大小的图时,最重要的是不要将批量大小编码为Python常量,而是使用符号 Tensor
来表示它。以下提示可能很有用:
用于
batch_size = tf.shape(input)[0]
从Tensor
调用input
中提取批量维,并将其存储在Tensor
调用中batch_size
。使用
tf.reduce_mean
而不是tf.reduce_sum(...) / batch_size
。如果使用 占位符进行输入,则可以通过创建占位符来指定变量批量维
tf.placeholder(..., shape=[None, ...])
。None
形状的 元素对应于可变尺寸的尺寸。
TensorBoard
如何可视化TensorFlow图?
参见图形可视化教程。
向TensorBoard发送数据的最简单的方法是什么?
向TensorFlow图添加摘要操作,并将这些摘要写入日志目录。然后,启动TensorBoard
python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory
有关更多详细信息,请参阅 Summaries和TensorBoard教程。
每次启动TensorBoard时,我都会得到一个网络安全弹出窗口!
您可以通过标记--host = localhost将本地主机的TensorBoard更改为“0.0.0.0”。这应该安静任何安全警告。
扩展TensorFlow
另请参阅向TensorFlow 添加新操作的how- to文档。
我的数据是自定义格式。如何使用TensorFlow读取它?
处理自定义格式的数据有两个主要选项。
更容易的选择是在Python中编写解析代码,将数据转换为numpy数组,然后tf.placeholder
为该数据提供 一个张量。有关详细信息,请参阅 使用占位符进行输入的文档。这种方法很容易启动和运行,但解析可能是性能瓶颈。
更有效的选择是 添加一个用C ++编写的解析您的数据格式的新操作。处理新数据格式的 指南有关于执行此操作的步骤的更多信息。
如何定义一个可变数量的输入的操作?
TensorFlow操作注册机制允许您定义作为单张量的输入,具有相同类型的张量列表(例如,将可变长度的张量列表相加在一起)或不同类型的张量列表(例如当将一个元组元组入队时)。有关如何使用输入或输出列表添加操作,请参阅how-to文档, 以获取有关如何定义这些不同输入类型的更多详细信息。
混杂
什么是TensorFlow的编码风格约定?
TensorFlow Python API遵守 PEP8惯例。*特别地,我们使用CamelCase
类的名称,以及snake_case
函数,方法和属性的名称。我们还坚持使用 Google Python风格的指南。
TensorFlow C ++代码基础遵循 Google C ++风格指南。
(*除了一个例外:我们使用2空格缩进而不是4空格缩进。)