[翻译] TensorFlow Programmer's Guide之Frequently Asked Questions(问得频率最多的几个问题)
目录:
- 特点和兼容性(Features and Compatibility)
- 建立一个TensorFlow图(Building a TensorFlow graph)
- 运行一个TensorFlow计算图(Running a TensorFlow computation)
- 变量(Variables)
- 张量的形状(Tensor shapes)
- TensorBoard
- TensorFlow扩展(Extending TensorFlow)
- 其他(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 TensorFlow。CIFAR-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.eval是tf.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.Variable, tf.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_raw, tf.decode_csv, tf.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(问得频率最多的几个问题)的更多相关文章
- TensorFlow 官方文档 Programmer's Guide 中文翻译 —— 引言
TensorFlow Programmer's Guide (Introduction) TensorFlow 编程手册 (引言) #(本项目对tensorflow官网上给出的指导手册(TF1.3版本 ...
- [转帖]Programmer’s guide to the big tech companies 💻
Programmer’s guide to the big tech companies
- [翻译] TensorFlow 分布式之论文篇 "TensorFlow : Large-Scale Machine Learning on Heterogeneous Distributed Systems"
[翻译] TensorFlow 分布式之论文篇 "TensorFlow : Large-Scale Machine Learning on Heterogeneous Distributed ...
- [翻译] TensorFlow 分布式之论文篇 "Implementation of Control Flow in TensorFlow"
[翻译] TensorFlow 分布式之论文篇 "Implementation of Control Flow in TensorFlow" 目录 [翻译] TensorFlow ...
- 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)
Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...
- 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 ...
- Frequently Asked Questions
转自:http://www.tornadoweb.org/en/stable/faq.html Frequently Asked Questions Why isn’t this example wi ...
- tmux frequently asked questions
tmux frequently asked questions How is tmux different from GNU screen? tmux and GNU screen have ...
- 成员函数指针 C++ FAQ LITE — Frequently Asked Questions
http://www.sunistudio.com/cppfaq/pointers-to-members.html C++ FAQ LITE — Frequently Asked Questions ...
随机推荐
- 用bat文件启动mongodb
bat文件是dos下的批处理文件.批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用cm ...
- C#内存泄漏--event内存泄漏
内存泄漏是指:当一块内存被分配后,被丢弃,没有任何实例指针指向这块内存, 并且这块内存不会被GC视为垃圾进行回收.这块内存会一直存在,直到程序退出.C#是托管型代码,其内存的分配和释放都是由CLR负责 ...
- Spring事务管理—aop:pointcut expression解析(转)
本文转载自: http://hane00.blog.163.com/blog/static/160061522011427473965/ 先来看看这个spring的配置文件的配置: <!-- 事 ...
- Shiro权限框架(二)
一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户"登录": 授权 - ...
- selenium2自动化测试学习笔记(一)
从这周开始学习自动化测试,采用selenium2,目标是在本月学习到appium,并测试公司的真实APP项目. 系统环境:win10 语言:python3.6.4 工具:selenium2 IDE:p ...
- MIPCMS V3.1.0 远程写入配置文件Getshell过程分析(附批量getshell脚本)
作者:i春秋作家--F0rmat 0×01 前言 今天翻了下CNVD,看到了一个MIPCMS的远程代码执行漏洞,然后就去官网下载了这个版本的源码研究了下.看下整体的结构,用的是thinkPHP的架 ...
- python 信号处理
linux开发中,通常会在进程中设置专门的信号处理方法,比如经常使用的CTRL+C,KILL等信号.如果你熟悉liunx编程,那么python等信号处理方法对你来说就很简单,下面的内容将主要介绍pyt ...
- c语言程序设计第6周编程作业一(分解质因数)
分解质因数 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在,你的程 ...
- 听翁恺老师mooc笔记(7)--字符串1
C语言中字符串的定义 如果定义一个字符数组word,并使用大括号对其初始化,如下图所示: 但是这个不是C语言的字符串,只是字符数组,不是字符串,因为不能使用字符串的方式进行计算.那么C语言的字符串长什 ...
- Bate敏捷冲刺每日报告--day5
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...