目录:

  1. 特点和兼容性(Features and Compatibility)
  2. 建立一个TensorFlow图(Building a TensorFlow graph)
  3. 运行一个TensorFlow计算图(Running a TensorFlow computation)
  4. 变量(Variables)
  5. 张量的形状(Tensor shapes)
  6. TensorBoard
  7. TensorFlow扩展(Extending TensorFlow)
  8. 其他(Miscellaneous)

特点和兼容性

1) 可以在多个计算机上分布式训练么?

可以!TensorFlow从版本0.8开始就支持分布式计算了。TensorFlow现在在一个或多个计算机上支持多个设备(CPUs或者GPUs)。

2) TensorFlow支持Python3么?

0.6.0版本后的TensorFlow,支持Python3.3+。

建立一个TensorFlow图(graph)

可以查看建立图的API文档(https://www.tensorflow.org/versions/master/api_guides/python/framework)。

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

在TensorFlow的Python API中,a,b和c都是tf.Tensor对象。一个Tensor对象是一个运算操作结果的符号句柄(a symbolic handle to the result of an operation),但是实际上并没有保存运算操作结果的值。反而,TensorFlow鼓励用户去建立一个复杂的表达式(比如整个神经网络和它的梯度)来作为一个数据流的图。然后你可以将整个数据流的图(或者其中的一个子图)给一个TensorFlow的tf.Session,它比起一个一个地执行运算操作,可以更有效地执行整个计算图。

2) 设备是怎么命名的?

对CPU设备来说,支持的设备名字是"/device:CPU:0"或"/cpu:0",对GPU来说,是"/device:GPU:i" (或者 "/gpu:i"),其中i表示第i个GPU设备。

3) 我如何将一个运算操作在指定的设备上运行?

将一组运算操作放置在指定设备上,可以将这些运算操作创建在 with tf.device(name):下。TensorFlow如何将运算操作绑定在设备的详细情况可以查看文档 using GPUs with TensorFlowCIFAR-10 tutorial 是如何使用多GPU的一个例子。

运行一个TensorFlow计算图

1) feeding和placeholder之间是怎么处理的?

Feeding是TensorFlow Session API中的一种机制,它可以允许你在运行时给一个或者多个tensor替换不同的值。tf.Session.run中feed_dict的参数一个映射tf.Tensor对象到numpy数组(或者其他一些类型)的字典,作为这些tensor每执行一步时的值。

一般地,你有某些特定的tensor,比如说输出,需要不停地提供数据。tf.placeholder操作符允许你定义一个必须被fed的tensor,其中你可以选择是否限制这些tensor的形状。可以查看 beginners' MNIST tutorial ,这是一个介绍placeholders和feeding如何为一个神经网络提供训练数据的例子。

2) Session.run() and Tensor.eval()的区别是什么?

如果t是一个tf.Tensor对象,tf.Tensor.evaltf.Session.run的速写方法。下面两个代码是等价的:

# 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())

在第二个例子中,session是一个上下文管理器( context manager),在with tf.Session():生命周期里面,默认的都是该session的。这个上下文管理器对一些简单的应用(如单元测试)有更简洁的代码。如果你的代码同时处理多个图(graph)和session,那么最好还是使用Session.run()来使程序变得更明确。

3) Session有生命周期么?中间过程产生的tensor呢?

Session可以拥有资源,比如说 tf.Variabletf.QueueBase,和tf.ReaderBase,这些资源占用了大量的内存空间。当session被关闭时(通过 tf.Session.close调用),这些资源(还有其对应的内存)将被释放。

作为调用Session.run()产生一部分中间tensor,会在调用该语句结束的时候或者之前被释放。

4) 运行时是否将计算图执行的部分并行化?

在多个不同的维度上,TensorFlow运行时并行化图形的执行:

(1)    
单个运算操作有并行实现,使用一个CPU的多个核心,或者一个GPU的多个线程

(2)    
在TensorFlow计算图中独立的节点可以在不同的设备上并行运行,因此可以使训练时使用多个GPU加速。可以查看这个例子: CIFAR-10 training using multiple GPUs

(3)    
Session API允许多个并行的步骤(比如并行调用 tf.Session.run)。这可以使运行时获得更高的吞吐量,如果单个步骤没有使用完你计算机上所有的资源的话。

5) TensorFlow支持什么语言调用?

TensorFlow被设计支持多种不同的语言调用。目前,Python是支持最好的语言。C++、Java和Go也支持执行和构造计算图。

TensorFlow也有一个基于C语言的API,来支持更多其他语言。

6) TensorFlow会充分利用计算机上所有可用的设备(CPU和GPU)么?

TensorFlow支持多CPU和GPU。TensorFlow如何将运算操作分配到设备上的细节可用去看文档 using GPUs with TensorFlow; CIFAR-10 tutorial是一个使用多GPU模型的例子。

注意:TensorFlow仅仅支持计算能力大于3.5的GPU设备。

7) 当使用一个reader 或者一个queue时,Session.run()为什么会暂停/终止?

tf.ReaderBase 和 tf.QueueBase两个类提供了特殊的操作,会使系统阻塞,直到可以使用输入(或者有界列队中有空余空间)。这些操作允许你建立更为精细的输出管道( input pipelines),当然另一方面会使TensorFlow计算变得更加复杂。可以查看 using QueueRunner objects to drive queues and readers 来获取更多如何使用它们的知识。

变量(Variables)

有关变量的知识可以查看 the API documentation for variables.。

1) 变量的生命周期是什么?

当你在一个会话(session)中运行tf.Variable.initializer操作时,一个变量将会被创建;当那个session被关闭时,该变量将被销毁。

2) 当变量同时被访问时,它们是怎么运作的?

变量允许并行读取和写入操作。当一个变量被并行地更新时,如果这时候读取这个变量,那么读取的值可能会改变。默认的情况下,对一个变量并行分配操作是允许在没有互斥锁的情况下运行。当操作一个变量时,为了可以对tf.Variable.assign传递use_locking=True来获取一个锁。

张量的形状(Tensor shapes)

也可以查看tf.TensorShape

1) 在Python中我们如何确定tensor的形状?

在TensorFlow中,一个tensor同时拥有一个静态(inferred)的形状和一个动态(true)的形状。静态的形状可以使用tf.Tensor.get_shape方法读取,这个读取的形状是创建tensor操作中推断出来的,可能是部分正确的。如果静态的形状没有完全被定义,那么一个Tensor类型的t的动态的形状可以使用 tf.shape(t)获得。

2) x.set_shape()和x=tf.reshape(x)之间的区别是什么?

tf.Tensor.set_shape方法更新一个Tensor对象的静态形状,这一般用于当不能被直接推断出来时,提供额外的形状信息。这个并不会改变tensor的动态形状。

_, image_data = tf.TFRecordReader(...).read(...)

image = tf.image.decode_png(image_data, channels=3)

# The height and width dimensions of `image` are data dependent, and

# cannot be computed without executing the op.

print(image.shape)

==> TensorShape([Dimension(None), Dimension(None), Dimension(3)])

# We know that each image in this dataset is 28 x 28 pixels.

image.set_shape([28, 28, 3])

print(image.shape)

==> TensorShape([Dimension(28), Dimension(28), Dimension(3)])

tf.reshape 操作创建了一个新的、动态形状不同的tensor。

# tensor 't' is [1, 2, 3, 4, 5, 6, 7, 8, 9]

# tensor 't' has shape [9]

reshape(t, [3, 3]) ==> [[1, 2, 3],

                        [4, 5, 6],

                        [7, 8, 9]]

# tensor 't' is [[[1, 1], [2, 2]],

#                [[3, 3], [4, 4]]]

# tensor 't' has shape [2, 2, 2]

reshape(t, [2, 4]) ==> [[1, 1, 2, 2],

                        [3, 3, 4, 4]]

3) 如何建立一个batch size可变的计算图?

建立一个batch size可变的计算图一般都是很有用的,比如相同的代码可以用于(mini-)batch training,single-instance inference。最后结果的计算图可以保存为一个protocol buffer( saved as a protocol buffer),导入进另外一个程序中( imported into another program)。

当建立一个可以大小的计算图时,最重要的事情是记住不要将batch size编码为Python的常量,而是要使用一个Tensor来表示它。下面两个说明可能是有用的:

(1)     使用batch_size = tf.shape(input)[0]从一个称为input的Tensor提取batch的维度,并且保存为名字叫batch_size的Tensor 。

(2)     使用tf.reduce_mean而不是tf.reduce_sum(...) / batch_size。

TensorBoard

1) 如何可视化TensorFlow计算图?

查看教程graph visualization tutorial

2) 把数据送到TensorBoard的最简单的方式是什么?

将summary ops加入到你的TensorFlow graph中,然后将这些summaries写到一个log目录下。接下来就可以使用如下命名启动TensorBoard:

python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory

更多细节,可以查看 Summaries and TensorBoard tutorial

3) 每次启动启动TensorBoard,就会弹出一个网络安全警告

你可以通过flag --host=localhost,来改变TensorBoard浏览器中的地址为localhost,而不是‘0.0.0.0’。

TensorFlow扩展(Extending TensorFlow)

1) 我的数据是自定义的格式,我如何使用TensorFlow读取该数据?

有3种主要的方法来处理自定义格式的数据。

最简单的方式是再Python中写一个解析代码,将该数据转换为一个numpy array。然后使用 tf.contrib.data.Dataset.from_tensor_slices从内存数据中创建一个输入管道(pipeline)。

2) 如果你的数据在内存中不合适(原话是:If your data doesn't fit in memory),那么尝试在Dataset pipeline中做解析。从一个合适的file reader开始,比如tf.contrib.data.TextLineDataset。然后通过映射(mapping)合适的操作转换数据集。更倾向于使用已经定义好的TensorFlow Operations,比如tf.decode_rawtf.decode_csvtf.parse_example, or tf.image.decode_png

3) 如果你的数据在使用TensorFlow自带函数不容易解析的情况下,可以考虑线下将其转换为可以容易解析的数据,比如${tf.python_io.TFRecordWriter$TFRecord} 格式。

还有一个更加有效的解析数据的方法就是增加一个用C++写的新的op,一个可以解析你数据的op。可以参考 guide to handling new data formats

其他

1) TensorFlow的编码风格是什么?

TensorFlow Python API遵守 PEP8编码风格。我们对类使用CamelCase风格,对函数、方法、属性(functions, methods, and properties)使用snake_case风格。我们也遵守 Google Python style guide

TensorFlow C++代码遵守Google C++ style guide

原文链接:https://www.tensorflow.org/versions/master/programmers_guide/faq

[翻译] TensorFlow Programmer's Guide之Frequently Asked Questions(问得频率最多的几个问题)的更多相关文章

  1. TensorFlow 官方文档 Programmer's Guide 中文翻译 —— 引言

    TensorFlow Programmer's Guide (Introduction) TensorFlow 编程手册 (引言) #(本项目对tensorflow官网上给出的指导手册(TF1.3版本 ...

  2. [转帖]Programmer’s guide to the big tech companies 💻

    Programmer’s guide to the big tech companies

  3. [翻译] TensorFlow 分布式之论文篇 "TensorFlow : Large-Scale Machine Learning on Heterogeneous Distributed Systems"

    [翻译] TensorFlow 分布式之论文篇 "TensorFlow : Large-Scale Machine Learning on Heterogeneous Distributed ...

  4. [翻译] TensorFlow 分布式之论文篇 "Implementation of Control Flow in TensorFlow"

    [翻译] TensorFlow 分布式之论文篇 "Implementation of Control Flow in TensorFlow" 目录 [翻译] TensorFlow ...

  5. 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)

    Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...

  6. Relinking Oracle Home FAQ ( Frequently Asked Questions) (Doc ID 1467060.1)

    In this Document   Purpose   Questions and Answers   1)  What is relinking ?   2)  What is relinking ...

  7. Frequently Asked Questions

    转自:http://www.tornadoweb.org/en/stable/faq.html Frequently Asked Questions Why isn’t this example wi ...

  8. tmux frequently asked questions

    tmux frequently asked questions How is tmux different from GNU screen?     tmux and GNU screen have ...

  9. 成员函数指针 C++ FAQ LITE — Frequently Asked Questions

    http://www.sunistudio.com/cppfaq/pointers-to-members.html C++ FAQ LITE — Frequently Asked Questions ...

随机推荐

  1. android中xml tools属性详解(转)

    第一部分 安卓开发中,在写布局代码的时候,ide可以看到布局的预览效果. 但是有些效果则必须在运行之后才能看见,比如这种情况:TextView在xml中没有设置任何字符,而是在activity中设置了 ...

  2. Android类参考---SQLiteOpenHelper

    public 抽象类 SQLiteOpenHelper 继承关系 java.lang.Object |____android.database.sqlite.SQLiteOpenHelper 类概要 ...

  3. 使用listview空控件展示数据

    1.使用listview控件可以一次性的将有关的全部图像保存在控件中,建立集合图像. 图像列表控件的主要属性 属性                                           ...

  4. php 常用数据大全

    一.数组操作的基本函数 数组的键名和值 array_values($arr);获得数组的值 array_keys($arr);获得数组的键名 array_flip($arr);数组中的值与键名互换(如 ...

  5. alpha冲刺第五天

    一.合照 二.项目燃尽图 三.项目进展 调整了一些界面的布局 细化了部分小功能的界面 注册界面和服务器响应了,但是在insert数据库方面出现了错误 四.明日规划 继续研究如何将注册的内容插入数据库 ...

  6. 冲刺NO.7

    Alpha冲刺第七天 站立式会议 项目进展 前期数据库设计所遗留的问题在今天得到了部分的解决,对物资管理所需要的数据内容进行了细化,但并未开始编写物资相关模块,主要精力还是放在项目的核心功能(信用管理 ...

  7. 前端之bootstrap模态框

    简介:模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. Modal简介 Modal实现弹出表单 M ...

  8. JAVA线程池原理详解(1)

    线程池的优点 1.线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用. 2.可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃. 线 ...

  9. EMC CX4-480服务器raid磁盘数据恢复案例

    [用户信息]上海某公司 [故障描述]需要进行数据恢复的设备是一台EMC CX4的存储服务器,因为硬盘出现故障导致整个存储阵列瘫痪.整个LUN是由7块1TB的硬盘组成的RAID 5.但服务器共有10块硬 ...

  10. css3动画transition详解

    一.transition-property 语法: transition-property : none | all | [ <IDENT> ] [ ',' <IDENT> ] ...