TensorFlow指南(二)——练习思考:上手TensorFlow

http://blog.csdn.net/u011239443/article/details/79075392

创建一个计算图而不是直接执行计算的主要好处是什么?主要的缺点是什么?

答:主要好处:

  • TensorFlow可以自动计算你的梯度(使用反向模式autodiff)。
  • TensorFlow可以在不同的线程中并行地运行并行操作。
  • 它使得在不同的设备上运行相同的模型变得更加容易。
  • 它简化了检查——例如,在TensorBoard中查看模型。

主要缺点:

  • 这使得学习门槛更加陡峭。
  • 它使逐步调试更加困难。

以下声明: a_val = a.eval(session=sess) 和: a_val = sess.run(a) 等价么?

答:等价。

以下声明: a_val, b_val = a.eval(session=sess), b.eval(ses sion=sess) 和: a_val, b_val = sess.run([a, b]) 等价么?

答:不等价。实际上,第一个语句两次运行该图形(一次用于计算a,一次用于计算b),而第二个语句只运行一次计算图。如果这些操作(或者它们依赖的操作)有副作用(例如,一个变量被修改,一个条目被插入到一个队列中,或者一个读取同一个文件),那么效果将会不同。如果它们没有副作用,那么两个语句将返回相同的结果,但是第二个语句将比第一个语句的速度更快。

您能在同一个会话中运行两个计算图吗?

不行

如果您创建一个包含变量w的计算图g,那么启动两个线程并在每个线程中打开一个会话,这两个线程都使用相同的图g,那么每个会话都有自己的变量w的副本,还是它会被共享?

在本地TensorFlow,会话管理变量值,如果您创建一个包含一个变量w图g,然后启动两个线程,每个线程中打开一个本地会话,都使用相同的图g,每个会话将有它自己的变量的副本w。然而,在分布式TensorFlow,变量值存储在容器管理的集群中,如果两个会话连接到相同的集群,并且使用相同的容器中,那么将共享相同的变量值w。

一个变量什么时候初始化?什么时候销毁?

变量在调用它的初始化器时被初始化,当会话结束时它会被销毁。在分布式TensorFlow中,变量在集群中的容器中生存,因此关闭一个会话不会破坏变量。要销毁一个变量,您需要清除它的容器。

placeholder 和 variable 的区别是什么?

  • variable 是一个保存值的操作。如果运行该变量,它将返回该值。在运行它之前,需要初始化它。可以更改变量的值(例如,通过使用赋值操作)。它是有状态的:变量在连续运行的计算图上保持相同的值。它通常用于保存模型参数,但也用于其他目的(例如,计算全局训练步骤)。
  • 从技术上来说,placeholder 其实并没有什么作用:它们只是持有它们所代表的张量的类型和形状的信息,但它们没有任何价值。事实上,如果试图评估一个依赖于placeholder的操作,那么必须为TensorFlow提供 placeholder 的值(使用提要参数),否则将得到一个异常。placeholder 通常用于在执行阶段为TensorFlow提供训练或测试数据。它们也可以用于将值传递给赋值节点,以更改变量的值(例如,模型权重)。

如何将一个变量设置为您想要的任何值(在执行阶段)?

在构造计算图时,可以指定一个变量的初始值,当在执行阶段运行变量的初始化器时,它将被初始化。如果您想在执行阶段将该变量的值更改为您想要的任何值,那么最简单的选择是使用 tf.assign() 函数创建一个赋值节点(在图构建阶段),将variable 和 placeholder 作为参数传递。在执行阶段,可以运行赋值操作,并使用placeholder 填充变量的新值:

import tensorflow as tf
x = tf.Variable(tf.random_uniform(shape=(), minval=0.0, maxval=1.0))
x_new_val = tf.placeholder(shape=(), dtype=tf.float32)
x_assign = tf.assign(x, x_new_val)
with tf.Session():
  x.initializer.run() 
  print(x.eval()) # 0.646157 
  x_assign.eval(feed_dict={x_new_val: 5.0}) 
  print(x.eval()) # 5.0

为了计算10个变量的成本函数的梯度,反向传播 autodiff(自动微分发) 需要多少次遍历图?关于正向传播 autodiff 呢? 符号微分法呢?

符号微分法、自动微分法 参阅:http://blog.csdn.net/u011239443/article/details/79074931

反向 autodiff(由TensorFlow实现)只需遍历图两次,就可以计算成本函数的梯度,与任意数量的变量有关。另一方面,正向 autodiff 需要为每个变量运行一次(如果我们想要10个不同的变量,则需要10次)。至于符号微分,它会构建一个不同的图来计算梯度,所以它不会完全穿越原始的图(除了构建新的梯度图)。一个高度优化的符号微分系统可能运行新的梯度图,一次计算所有变量的梯度,但是与原始图相比,这个新图可能会非常复杂低效。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏落影的专栏

程序员进阶之算法练习(十四)

前言 坚持做算法练习对开发的好处是抽象能力变强,拿到一个需求能很快对其进行抽象,然后再用学过的设计模式相关知识进行整理,最后用代码实现。 最大的好处在于:对...

3507
来自专栏码云1024

Tensorflow 搭建神经网络 (一)

本文为中国大学MOOC课程《人工智能实践:Tensorflow笔记》的笔记中搭建神经网络,总结搭建八股的部分

63715
来自专栏Python爬虫与数据挖掘

浅谈网络爬虫中深度优先算法和简单代码实现

学过网站设计的小伙伴们都知道网站通常都是分层进行设计的,最上层的是顶级域名,之后是子域名,子域名下又有子域名等等,同时,每个子域名可能还会拥有多个同级域名,而且...

1554
来自专栏性能与架构

算法中描述复杂度的大O是什么意思?

简介 算法是解决问题的方法,通常一个问题会有多种解决方法,就是有多种算法,那么我们如何决定哪个算法更好或者更高效呢? 为了描述一个算法的效率,就用到了这个大O,...

3335
来自专栏深度学习之tensorflow实战篇

R常用基本 函数汇总整理

help() 或者 ? + command 这是学习和使用R最常用到的命令。 help.search() 或者?? 搜索包含制定字串或pattern的...

3353
来自专栏码匠的流水账

HashedWheelTimer算法详解

George Varghese 和 Tony Lauck 1996 年的论文:Hashed and Hierarchical Timing Wheels: da...

1541
来自专栏Leetcode名企之路

【Leetcode】62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

1121
来自专栏AI研习社

Github 项目推荐 | 用 tf * idf 计算文本之间的相似度

该库是具有 tf * idf 权重的 Ruby 向量空间模型(VSM),它能够用 tf * idf 计算文本之间的相似度。

1374
来自专栏翻译

路径查找器AI

问题源于我想建立一个游戏AI,它要能够定义一条从起点到终点的路径,同时避开路上的墙壁障碍物。为此,我写了一个C#库(path.dll),它允许定义一个二维空间(...

2317
来自专栏王小雷

R语言基础命令与安装

1. R的安装过程 1.1.首先附上清华线路的下载链接Windows版3.3.1 1.2. 选择安装路径 ? 1.3. 注意根据自己的计算机位数选择,如我的是6...

2355

扫码关注云+社区

领取腾讯云代金券