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+。

构建张量流图

另请参阅关于构建图API文档

为什么c = tf.matmul(a, b)不立即执行矩阵乘法?

TensorFlow的Python API中,abctf.Tensor对象。一个Tensor对象是一个象征性的手柄操作的结果,但实际上并不持有该操作的输出值。相反,TensorFlow鼓励用户将复杂的表达式(如整个神经网络及其渐变)构建为数据流图。然后,您可以将整个数据流图(或其子图)的计算卸载到TensorFlow 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计算

另请参阅关于运行图API文档

什么是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.runsess当前位置的缩写)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.Variabletf.QueueBasetf.ReaderBase; 这些资源可以使用大量的内存。这些资源(和关联的内存)在会话关闭时通过调用被释放tf.Session.close

作为呼叫的一部分创建的中间张量Session.run()将在呼叫结束时或之前释放。

运行和图的执行并行化吗?

TensorFlow运行时间跨多个不同维度并行化图形执行:

  • 各个操作系统可以并行实现,使用CPU中的多个内核或GPU中的多个线程。

  • TensorFlow图形中的独立节点可以在多个设备上并行运行,因此可以使用多个GPU加速CIFAR-10操练。

  • Session API允许多个并发步骤(即tf.Session.run并行调用),如果单个步骤不使用计算机中的所有资源,则可以使运行时获得更高的吞吐量。

TensorFlow支持哪些客户端语言?

TensorFlow支持多种客户端语言。目前,支持最好的客户端语言是Python。用于执行和构建图的实验接口也可用于C ++JavaGo

TensorFlow还有一个基于C的客户端API来帮助构建对更多客户端语言的支持。我们欢迎构建支持新语言的贡献。

由TensorFlow维护人员支持的C API之上的开源社区创建和支持的各种其他语言(如C#JuliaRubyScala)的绑定。

TensorFlow是否利用我的机器上可用的所有设备(GPU和CPU)?

TensorFlow支持多个GPU和CPU。有关TensorFlow如何为设备分配操作的详细信息,请参阅有关使用GPU与TensorFlow的how-to文档,以及有关使用多个GPU的示例模型的CIFAR-10教程。

请注意,TensorFlow仅使用计算能力大于3.5的GPU设备。

为什么Session.run()在使用阅读器或队列时挂起?

tf.ReaderBasetf.QueueBase类提供一种能够特别行动——在输入变为可用前阻拦(或自由空间中有界队列)。这些操作允许您构建复杂的输入流水线,代价是使TensorFlow计算更加复杂。请参阅使用QueueRunner对象驱动队列和读取器的how-to文档以获取有关如何使用它们的更多信息。

变量

另请参阅变量的说明文档和变量的API文档

变量的生命周期是什么?

当您首次tf.Variable.initializer在会话中为该变量运行该操作时,会创建一个变量。tf.Session.close它被销毁了。

变量在同时访问时如何表现?

变量允许并发读写操作。如果同时更新,则从变量读取的值可能会更改。默认情况下,对变量的并发赋值操作允许运行而不互斥。分配给变量时要获取锁,传递use_locking=Truetf.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操作将创建一个具有不同动态形状的新张量。

我如何构建可用于批量变量的图形?

例如,建立一个可用于批量变量的图形通常很有用,例如,可以使用相同的代码进行(小型)批量训练和单实例推理。生成的图形可以保存为协议缓冲区导入到另一个程序中

在构建可变大小图形时,最重要的是不要将批量大小编码为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_rawtf.decode_csvtf.parse_example,或tf.image.decode_png

如果您的数据不易通过内置的TensorFlow操作进行分析,请考虑将其脱机转换为易于分析的格式,例如$ {tf.python_io.TFRecordWriter $ TFRecord}格式。

定制解析行为的更有效的方法是添加一个用C ++编写的解析数据格式的新操作。处理新数据格式的指南提供了有关执行此操作步骤的更多信息。

其他

什么是TensorFlow的编码风格约定?

TensorFlow Python API遵循PEP8约定。*特别是,我们使用CamelCase名称作为类,snake_case名称用于函数,方法和属性。我们也坚持使用Google Python风格指南。

TensorFlow C ++代码库遵守Google C ++风格指南

(*有一个例外:我们使用2空格缩进而不是4空格缩进。)