目录:

  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. angularJS前台传list数组,后台springMVC接收数组

    有时候需要在前台自定义对象,然后把对象封装在list中,在传送到后台,这样的思想也比较合理 1. 前台代码 $scope.saveScore = function () { $scope.userSc ...

  2. 分别用EasyAR和Vuforia开发AR(入门级)

    最近在一边学习谷歌TensorFlow,一边在做些简单的AR demo,在此总结下学习经验(自学的过程异常痛苦啊,还有总会有好人会在社区分享经验,这就是前人栽树,后人乘凉呐) 自从任天堂推出<精 ...

  3. 吐槽net下没有靠谱的FastDFS的sdk之使用thrift实现JAVA和C#互通

    事情是这样的,在一个新项目中引入了fastdfs,用这玩意做一些小数据的存储还是很方便的,然后在nuget上就找一个对接FastDFS的sdk,如下图: 一眼就看到了这个top1的sdk,应该会比较靠 ...

  4. Java 并发学习笔记

    并发 最近重新复习了一边并发的知识,发现自己之前对于并发的了解只是皮毛.这里总结以下Java并发需要掌握的点. 使用并发的一个重要原因是提高执行效率.由于I/O等情况阻塞,单个任务并不能充分利用CPU ...

  5. 剑指Kubernetes 揭秘腾讯云的PaaS技术选型策略

    1.前言 Kubernetes 很火,一大批互联网公司早已领先一步,搭建起专有的 PaaS平台,传统企业们看到的 Kubernetes的趋势,亦不甘落后,在试水的道上一路狂奔-- 虽然,Kuberne ...

  6. Algorithm --> DFS和BFS

    定义结点 struct MGraph { int vexs[MAXVEX]; //顶点数组 int arc[MAXVEX][MAXVEX]; //邻接矩阵 int numVertex, numEdge ...

  7. js前端读写文件的方法(json、excel)

    1.前端读取文件的实现 关键:利用文件上传对话框预览本地文件.利用FileReader读取文件 前端预览本地文件 <input tabindex="-1" id=" ...

  8. CentOS7搭建solr7.2

    solr介绍 一.Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中. 二.Solr 提供了层面搜索(就是统计).命中醒目显示并且支持多种输出格式( ...

  9. java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息

    本文直接附上源代码,如下是自己写的一个例子 面试题需求: 使用Condition来实现 三个线程 线程1 线程2 线程3 三个交替输出 [按照 线程1(main)-->线程2-->线程3] ...

  10. (译文)学习ES6非常棒的特性-字符串常量基础

    字符串常量基础 在ES2015之前我们是这么拼接字符串的: var result = 10; var prefix = "the first double digit number I le ...