Sklearn 与 TensorFlow 机器学习实用指南——第九章习题答案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kwame211/article/details/86611458

Sklearn 与 TensorFlow 机器学习实用指南——第九章习题答案

进入该书的第二部分,深度学习与tensorflow,本书的重点不是原理,更重要的是编程实现,所以原理部分已经是言简意赅了,而且第二部分重在tensorflow的学习,所以不做总结,写一些习题。文档地址
创建计算图而不是直接执行计算有哪些主要好处? 主要缺点是什么?
优点:
Tensorflow可以计算梯度(使用反向autodiff)
TensorFlow可以在不同的线程中并行运行操作
在不同设备上运行相同模型变得更加容易
简化了内省 - 例如,在TensorBoard中查看模型
缺点:
学习曲线更加陡峭。
分步调试变得更加困难。
 
语句a_val = a.eval(session = sess)是否等同于a_val = sess.run(a)?
是的,两种语法等同
1
语句a_val = a.eval(session = sess),b.eval(ses sion = sess
)相当于a_val,b_val = sess.run([a,b])?
不等同。
语句a_val = a.eval(session = sess),b.eval(session = sess)不等同于a_val,b_val = sess.run([a,b])。
实际上,第一个语句运行图形两次(一次计算a,一次计算b),而第二个语句只运行一次图形。 如果这些操作中的任何一个
(或它们所依赖的操作)具有副作用(例如,变量被修改,项目被插入队列,或者读取器读取文件),那么效果将是不同的。 
如果它们没有副作用,则两个语句将返回相同的结果,但第二个语句将比第一个语句更快。
 
能在同一个会话中运行两个图吗?
不能,无法在同一会话中运行两个图表。 一定要运行须首先将图形合并为单个图形。
1
如果你创建一个包含变量w的图g,那么启动两个线程并在每个线程中打开一个会话,两个都使用相同的图g,每个会话都有自己的变量w副本还是会被共享?
在本地TensorFlow中,会话管理变量值,因此如果您创建包含变量w的图g,则启动两个线程并在每个线程中打开本地会话,
两者都使用相同的图g,然后每个会话将拥有自己的副本 变量w。 但是,在分布式TensorFlow中,变量值存储在由集群管理的
容器中,因此如果两个会话连接到同一个集群并使用相同的容器,则它们将共享w的相同变量值。
 
何时变量初始化? 什么时候被摧毁?
调用其初始化程序时会初始化变量,并在会话结束时销毁它。 在分布式TensorFlow中,变量存在于集群中的容器中,
因此关闭会话不会破坏变量。 要销毁变量,您需要清除其容器。
1
2
占位符和变量之间有什么区别?
两者有非常的非常大的区别:
变量是保存值的操作。如果运行变量,则返回该值。在运行它之前,您需要初始化它。您可以更改变量的值(例如,通过使用赋值操作)。
它是有状态的:变量在连续运行图形时保持相同的值。 它通常用于保存模型参数,但也用于其他目的(例如,计算全局训练步骤)。

占位符在技术上没有做太多:它们只是保存有关它们所代表的张量的类型和形状的信息,但它们没有价值。
实际上,如果尝试评估依赖于占位符的操作,则必须向TensorFlow提供占位符的值(使用feed_dict参数),否则将获得异常。 
占位符通常用于在执行阶段将训练或测试数据提供给TensorFlow。 它们也可用于将值传递给赋值节点,以更改变量的值。
 
运行图表以评估依赖于占位符但不提供其值的操作时会发生什么? 如果操作不依赖于占位符会发生什么?
如果运行图形来评估依赖于占位符但仍未提供其值的操作,则会出现异常。 如果操作不依赖于占位符,则不会引发异常。
1
运行图形时,是否可以提供任何操作的输出值,或仅提供占位符的值?
运行图形时,可以提供任何操作的输出值,而不仅仅是占位符的值。 
1
如何将变量设置为您想要的任何值(在执行阶段)?
可以在构造图形时指定变量的初始值,并且稍后在执行阶段运行变量的初始化程序时将对其进行初始化。 如果要在执行阶段
将该变量的值更改为您想要的任何值,则最简单的选项是使用tf.assign()函数创建赋值节点(在图构建阶段),将变量和
占位符作为参数传递。 在执行阶段,您可以运行赋值操作并使用占位符提供变量的新值。
 
反向模式autodiff需要遍历图表多少次才能计算成本函数相对于10个变量的梯度? 那么前向模式的autodiff呢? 符号微分?
反向模式自动编排(由TensorFlow实现)需要遍历图形两次,以便计算与任意数量的变量有关的成本函数的梯度。
另一方面,前向模式autodiff需要为每个变量运行一次(如果我们想要关于10个不同变量的渐变,则需要10次)。 
至于符号微分,它会构建一个不同的图来计算渐变,因此它根本不会遍历原始图(除非在构建新的渐变图时)。 
高度优化的符号分化系统可能仅在针对所有变量计算梯度时潜在地运行新的梯度图,但是与原始图相比,新图可能非常复杂且效率低。
 

猜你喜欢

转载自blog.csdn.net/kwame211/article/details/86611458