声明:

  1. 翻译tensorflow官方文档并进行了总结
  2. 参考博客tensorflow学习笔记(四十一):control dependencies

tf.control_dependecies()

tf.control_dependencies是tensorflow中的一个flow顺序控制机制,作用有二:插入依赖(dependencies)和清空依赖(依赖是op或tensor)。常见的tf.control_dependenciestf.Graph.control_dependencies的装饰器,它们用法是一样的。通过本文,你将了解:

control_dependencies介绍

tf.control_dependencies()有一个参数control_inputs(这是一个列表,列表中可以是OperationTensor对象),返回一个上下文管理器(通常与with一起使用)。

例1

with tf.control_dependencies([a, b, c]):d = ...e = ...

session在运行d、e之前会先运行a、b、c。在with tf.control_dependencies之内的代码块受到顺序控制机制的影响。

例2

with tf.control_dependencies([a, b]):with tf.control_dependencies([c, d]):e = ...

session在运行e之前会先运行a、b、c、d。因为依赖会随着with tf.control_dependencies的嵌套一直继承下去。

例3

with tf.control_dependencies([a, b]):with tf.control_dependencies(None):  # 第二层上下文管理器with tf.control_dependencies([c, d]):e = ...

session在运行e之前会先运行c、d,不需要运行a、b。因为在第二层的上下文管理器中,参数control_inputs的值为None,如此将会清除之前所有的依赖。

在BN中的使用

tf.layers.batch_normalization()中用到的变量——当前估计的均值方差是untrainable的,它们通过每个batch的均值和标准差的移动平均更新值,位于collection——tf.GraphKeys.UPDATE_OPS中。因此,需要在每一轮迭代前插入这个操作:

with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)

这样,在每次迭代调用train_step之前都会先当前batch下的均值方差的移动平均值。

几种不正确的使用方式

例1

op或tensor在流图中的顺序由它们的创建位置决定。

# 不正确
def my_func(pred, tensor):t = tf.matmul(tensor, tensor)with tf.control_dependencies([pred]):# matmul op的定义在context之外,context内只有一个op或tensor不能继承依赖。return t# 应改为
def my_func(pred, tensor):with tf.control_dependencies([pred]):# 应将t的创建放到context之内t = tf.matmul(tensor, tensor)return t

例2

tensorflow在求导过程中自动忽略常数项。

# 不正确
loss = model.loss()
with tf.control_dependencies(dependencies):loss = loss + tf.constant(1)
return tf.gradients(loss, model.variables)

因为常数项tf.constant(1)在back propagation时被忽略了,所以依赖性在BP的时候也不会被执行。

例3

w = tf.Variable(1.0)
ema = tf.train.ExponentialMovingAverage(0.9)
update = tf.assign_add(w, 1.0)ema_op = ema.apply([update])
with tf.control_dependencies([ema_op]):ema_val = ema.average(update)with tf.Session() as sess:tf.global_variables_initializer().run()for i in range(3):print(sess.run([ema_val]))# 应改为
with tf.control_dependencies([ema_op]):ema_val = tf.identity(ema.average(update))  # 加一个identity

看起来好像是在运行ema_val之前先执行ema_op,实际不然。因为ema.average(update)不是一个op,它只是从ema对象的一个字典中取出键对应的tensor`而已。这个清空跟上文例一很像。

例4

import tensorflow as tf
w = tf.Variable(1.0)
ema = tf.train.ExponentialMovingAverage(0.9)
update = tf.assign_add(w, 1.0)ema_op = ema.apply([update])
with tf.control_dependencies([ema_op]):w1 = tf.Variable(2.0)ema_val = ema.average(update)with tf.Session() as sess:tf.global_variables_initializer().run()for i in range(3):print(sess.run([ema_val, w1]))

这种情况下,control_dependencies也不工作,原因如下:

#这段代码出现在Variable类定义文件中第287行,
# 在创建Varible时,tensorflow是移除了dependencies了的
#所以会出现 control 不住的情况
with ops.control_dependencies(None):...

转自:

https://blog.csdn.net/hustqb/article/details/83545310

tensorflow之control_dependencies相关推荐

  1. tensorflow学习笔记:tf.control_dependencies,tf.GraphKeys.UPDATE_OPS,tf.get_collection

    tf.control_dependencies(control_inputs): control_dependencies(control_inputs) ARGS: control_inputs:在 ...

  2. 【转】tensorflow中的batch_norm以及tf.control_dependencies和tf.GraphKeys.UPDATE_OPS的探究

    笔者近来在tensorflow中使用batch_norm时,由于事先不熟悉其内部的原理,因此将其错误使用,从而出现了结果与预想不一致的结果.事后对其进行了一定的调查与研究,在此进行一些总结. 一.错误 ...

  3. TensorFlow算子融合

    TensorFlow算子融合 • TensorFlow的特点: o 真正的可移植性 o 引入各种计算设备的支持,包括CPU,GPU,以及能够很好的运行在各种系统的移动端 o 多语言支持 o 支持C++ ...

  4. TensorFlow学习笔记——实现经典LeNet5模型

    TensorFlow实现LeNet-5模型 文章目录 TensorFlow实现LeNet-5模型 前言 一.什么是TensorFlow? 计算图 Session 二.什么是LeNet-5? INPUT ...

  5. 使用自己的数据集训练MobileNet、ResNet实现图像分类(TensorFlow)| CSDN博文精选

    作者 | pan_jinquan 来源 | CSDN博文精选 之前写了一篇博客<使用自己的数据集训练GoogLenet InceptionNet V1 V2 V3模型(TensorFlow)&g ...

  6. TensorFlow练习16: 根据大脸判断性别和年龄

    本帖使用TensorFlow做一个根据脸部推断照片人物年龄和性别的练习,网上有很多类似app. 训练数据 – Adience数据集 Adience数据集来源为Flickr相册,由用户使用iPhone或 ...

  7. TensorFlow练习24: GANs-生成对抗网络 (生成明星脸)

    GANs是Generative Adversarial Networks的简写,中文翻译为生成对抗网络,它最早出现在2014年Goodfellow发表的论文中:Generative Adversari ...

  8. 使用Tensorflow实现残差网络ResNet-50

    这篇文章讲解的是使用Tensorflow实现残差网络resnet-50. 侧重点不在于理论部分,而是在于代码实现部分.在github上面已经有其他的开源实现,如果希望直接使用代码运行自己的数据,不建议 ...

  9. Tensorflow BatchNormalization详解:4_使用tf.nn.batch_normalization函数实现Batch Normalization操作...

    使用tf.nn.batch_normalization函数实现Batch Normalization操作 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearnin ...

最新文章

  1. 从技术谈到管理,把系统优化的技术用到企业管理
  2. 华为某员工欲离职,看到年终奖后犹豫了:再干一年吧!
  3. iOS 隐藏顶部状态栏方式和更改颜色
  4. Ubuntu install of ROS Melodic
  5. 推销自己的海盗猫王运营商
  6. 简述ipython的特点 app_介绍、基本语法、流程控制
  7. DolphinDB配置
  8. More Effective C++ 笔记
  9. 微服务配置中心实战:Spring + MyBatis + Druid + Nacos 1
  10. [转载]一个本科生在世界五大顶尖咨询公司实习心得
  11. 电荷泵负电源芯片SGM3207
  12. Java解析省市县树形结构工具类
  13. Socket编程(Android客户端+PC服务器端)
  14. cairo填充_cairo 图形库
  15. JDK Oracle 官网下载地址
  16. 理解Linux中的进程状态
  17. 百度的专业检索方法(我们所不知道的搜索语法)
  18. JAVA实现CSV文件转JSON。
  19. 三菱PLC与第三方设备TCP通讯_不用在PLC内编程,快速实现西门子与欧姆龙、三菱等品牌的PLC之间实时通讯...
  20. JavaScript的数据存储方式

热门文章

  1. MINA,xSocket同样的性能缺陷及陷阱,Grizzly better
  2. web 前端必备学习指南-精华
  3. 10个最好的 Node.js MVC 框架
  4. 黑苹果mac未能安装在你的电脑上_经历了无数次失败以后,我终于“吃”上了黑苹果,经验分享!...
  5. python中的leap_Python-规则打破了leap年?
  6. 超链接一般有两种表现形式_外链的三种常见表现形式
  7. Win10不能直接拖文件/Foxmail不能拖文件解决办法
  8. HTML5 -canvas拖拽、移动 绘制图片可操作移动,拖动
  9. VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
  10. 一个很奇特的异常 tmpFile.renameTo(classFile) failed