Frequently Asked Questions(问的频率最高的问题)
Frequently Asked Questions
本文档提供有关TensorFlow的一些常见问题解答。如果您的问题未在此处介绍,您或许可以在TensorFlow 社区资源中找到答案。
功能和兼容性
我可以在多台电脑上运行分布式操作吗?
是!TensorFlow在0.8版本中获得了对分布式计算的支持。TensorFlow现在支持一台或多台计算机中的多个设备(CPU和GPU)。
TensorFlow与Python 3兼容吗?
截至0.6.0发布时间框架(2015年12月初),支持Python 3.3+。
构建张量流图
为什么c = tf.matmul(a, b)不立即执行矩阵乘法?
在Tensor
Flow的Python API中,a
,b
和c
是tf.Tensor
对象。一个Tensor
对象是一个象征性的手柄操作的结果,但实际上并不持有该操作的输出值。相反,Tensor
Flow鼓励用户将复杂的表达式(如整个神经网络及其渐变)构建为数据流图。然后,您可以将整个数据流图(或其子图)的计算卸载到Tensor
Flow tf.Session
,它能够比逐个执行操作更有效地执行整个计算。
如何命名设备?
The supported device names are "/device:CPU:0"
(or "/cpu:0"
) for the CPU device, and "/device:GPU:i"
(or "/gpu:i"
) for the _i_th GPU device.
如何将操作放置在特定设备上?
要在设备上放置一组操作,请在with tf.device(name):
上下文中创建。有关TensorFlow如何为设备分配操作的详细信息,请参阅有关使用GPU与TensorFlow的how-to文档,以及有关使用多个GPU的示例模型的CIFAR-10教程。
运行TensorFlow计算
什么是Feeding和占位符交易?
Feeding是TensorFlow Session API中的一种机制,它允许您在运行时用一个或多个张量替换不同的值。feed_dict
论点到tf.Session.run
是一个映射tf.Tensor
对象到numpy的阵列(和一些其他类型的)的字典,将被用作在执行步骤中那些张量的值。
通常情况下,你有一定的张量,比如输入,总是会被输入。该tf.placeholder
操作允许您定义必须
被输入的张量,并且还可以选择允许您限制其形状。有关如何使用占位符和feeding来为神经网络提供操练数据的示例,请参阅初学者的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()
。
Sessions会有生命周期吗?中间张量呢?
会议可以根据自己的资源,如tf.Variable
,tf.QueueBase
和tf.ReaderBase
; 这些资源可以使用大量的内存。这些资源(和关联的内存)在会话关闭时通过调用被释放tf.Session.close
。
作为呼叫的一部分创建的中间张量Session.run()
将在呼叫结束时或之前释放。
运行和图的执行并行化吗?
TensorFlow运行时间跨多个不同维度并行化图形执行:
- 各个操作系统可以并行实现,使用CPU中的多个内核或GPU中的多个线程。
- TensorFlow图形中的独立节点可以在多个设备上并行运行,因此可以使用多个GPU加速CIFAR-10操练。
- Session API允许多个并发步骤(即
tf.Session.run
并行调用),如果单个步骤不使用计算机中的所有资源,则可以使运行时获得更高的吞吐量。
TensorFlow支持哪些客户端语言?
TensorFlow支持多种客户端语言。目前,支持最好的客户端语言是Python。用于执行和构建图的实验接口也可用于C ++,Java和Go。
TensorFlow还有一个基于C的客户端API来帮助构建对更多客户端语言的支持。我们欢迎构建支持新语言的贡献。
由TensorFlow维护人员支持的C API之上的开源社区创建和支持的各种其他语言(如C#,Julia,Ruby和Scala)的绑定。
TensorFlow是否利用我的机器上可用的所有设备(GPU和CPU)?
TensorFlow支持多个GPU和CPU。有关TensorFlow如何为设备分配操作的详细信息,请参阅有关使用GPU与TensorFlow的how-to文档,以及有关使用多个GPU的示例模型的CIFAR-10教程。
请注意,TensorFlow仅使用计算能力大于3.5的GPU设备。
为什么Session.run()在使用阅读器或队列时挂起?
在tf.ReaderBase
与tf.QueueBase
类提供一种能够特别行动——在
输入变为可用前阻拦
(或自由空间中有界队列)。这些操作允许您构建复杂的输入流水线,代价是使TensorFlow计算更加复杂。请参阅使用QueueRunner
对象驱动队列和读取器的how-to文档以获取有关如何使用它们的更多信息。
变量
另请参阅变量的说明文档和变量的API文档。
变量的生命周期是什么?
当您首次tf.Variable.initializer
在会话中为该变量运行该操作时,会创建一个变量。tf.Session.close
它被销毁了。
变量在同时访问时如何表现?
变量允许并发读写操作。如果同时更新,则从变量读取的值可能会更改。默认情况下,对变量的并发赋值操作允许运行而不互斥。分配给变量时要获取锁,传递use_locking=True
给tf.Variable.assign
。
张量形状
另见tf.TensorShape
。
我如何确定Python中张量的形状?
在Tensor
Flow中,张量具有静态(推断)形状和动态(真实)形状。可以使用该tf.Tensor.get_shape
方法读取静态形状:此形状是从用于创建张量的操作中推断出来的,并且可能部分完成。如果静态形状未完全定义,则Tensor
t
可以通过评估来确定a的动态形状tf.shape(t)
。
x.set_shape()和x = tf.reshape(x)之间有什么区别?
tf.Tensor.set_shape
方法更新Tensor
对象的静态形状,通常用于在无法直接推断时提供其他形状信息。它不会改变张量的动态形状。
tf.reshape
操作将创建一个具有不同动态形状的新张量。
我如何构建可用于批量变量的图形?
例如,建立一个可用于批量变量的图形通常很有用,例如,可以使用相同的代码进行(小型)批量训练和单实例推理。生成的图形可以保存为协议缓冲区并导入到另一个程序中。
在构建可变大小图形时,最重要的是不要将批量大小编码为Python常量,而是使用符号Tensor
来表示它。以下提示可能会有用:
- 从
Tensor
调用用batch_size = tf.shape(input)[0]
提取批量维度input
,并将其存储在Tensor
调用中,命名为batch_size
。
- 使用,
tf.reduce_mean
而不是tf.reduce_sum(...) / batch_size
。
张量版
如何可视化张量流图?
请参阅图形可视化教程。
向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添加新操作的文档。
我的数据是自定义格式。我如何使用TensorFlow读取它?
处理自定义格式的数据有三个主要选项。
最简单的选择是用Python编写解析代码,将数据转换为numpy数组。然后使用tf.data.Dataset.from_tensor_slices
从内存数据创建输入管道。
如果您的数据不适合内存,请尝试在数据集管道中进行解析。从一个合适的文件阅读器开始,比如tf.data.TextLineDataset
。然后通过映射映射适当的操作来转换数据集。倾向预定TensorFlow操作,例如tf.decode_raw
,tf.decode_csv
,tf.parse_example
,或tf.image.decode_png
。
如果您的数据不易通过内置的TensorFlow操作进行分析,请考虑将其脱机转换为易于分析的格式,例如$ {tf.python_io.TFRecord
Writer $ TFRecord
}格式。
定制解析行为的更有效的方法是添加一个用C ++编写的解析数据格式的新操作。处理新数据格式的指南提供了有关执行此操作步骤的更多信息。
其他
什么是TensorFlow的编码风格约定?
TensorFlow Python API遵循PEP8约定。*特别是,我们使用CamelCase
名称作为类,snake_case
名称用于函数,方法和属性。我们也坚持使用Google Python风格指南。
TensorFlow C ++代码库遵守Google C ++风格指南。
(*有一个例外:我们使用2空格缩进而不是4空格缩进。)