深度学习库能够充分发挥GPU并行计算的能力,但是有时我们却不得不需要串行。这时就需要用到依赖控制。

import tensorflow as tf

a = tf.Variable(1)
b = tf.Variable(2)
s = tf.add(a, b)
asiggn = tf.assign(a, 4)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([a, b, s, asiggn]))

理论上,这段程序有时输出6,有时输出3。也就是说,求和操作和复制操作无法确定谁先执行。

如果想要先求和再赋值,那么需要使用依赖控制指明依赖。

import tensorflow as tf

a = tf.Variable(1)
b = tf.Variable(2)
s = tf.add(a, b)
with tf.control_dependencies([s]):
asiggn = tf.assign(a, 4)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([a, b, s, asiggn]))

每一次sess.run,每个结点只求解一次。

然而需要理解的一个关键点是:

将多个结点打包之后,对这个包加上依赖控制,并不会影响被打包的各个结点的依赖。

# 将结点打包,同时执行多个结点
import tensorflow as tf tf.reset_default_graph()
a = tf.Variable(1, name="a")
b = tf.Variable(2, name="b")
c = tf.Variable(3, name="c")
with tf.control_dependencies([a, b, c]):
before_sum = tf.add_n([a, b, c])
a_add1 = tf.assign(a, tf.add(a, 1, name='a_add1'))
b_add2 = tf.assign(b, tf.add(b, 2, name='b_add2'))
c_add3 = tf.assign(c, tf.add(c, 3, name='c_add3')) with tf.control_dependencies([before_sum]):
# group操作run之后返回值为None,它只负责同时执行,它并不负责控制依赖
op = tf.group(a_add1, b_add2, c_add3)
with tf.control_dependencies([op]): # 如果没有这句话,则sum操作和op操作是并行的,导致出现奇怪的现象
after_sum = tf.add_n([a, b, c])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([before_sum, op, a, b, c, after_sum]))

输出为:[12, None, 2, 4, 6, 12]

表示beforesum并没有在op之前执行。

要想在op之前求before_sum,那就需要为op中的每个结点添加依赖

# 将结点打包,同时执行多个结点
import tensorflow as tf tf.reset_default_graph()
a = tf.Variable(1, name="a")
b = tf.Variable(2, name="b")
c = tf.Variable(3, name="c")
with tf.control_dependencies([a, b, c]):
before_sum = tf.add_n([a, b, c])
with tf.control_dependencies([before_sum]):
a_add1 = tf.assign(a, tf.add(a, 1, name='a_add1'))
with tf.control_dependencies([before_sum]):
b_add2 = tf.assign(b, tf.add(b, 2, name='b_add2'))
with tf.control_dependencies([before_sum]):
c_add3 = tf.assign(c, tf.add(c, 3, name='c_add3')) with tf.control_dependencies([before_sum]):
# group操作run之后返回值为None,它只负责同时执行,它并不负责控制依赖
op = tf.group(a_add1, b_add2, c_add3)
with tf.control_dependencies([op]): # 如果没有这句话,则sum操作和op操作是并行的,导致出现奇怪的现象
after_sum = tf.add_n([a, b, c])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([before_sum, op, a, b, c, after_sum]))
"""
执行顺序不同会出现什么情况
"""

Tensorflow结点打包和依赖控制的更多相关文章

  1. gradle 打包所有依赖 Invalid signature file digest for Manifest main attributes(转)

    1.打包所有依赖: // 指定main函数的类 jar { manifest { attributes "Main-Class": "com.baeldung.fatja ...

  2. Maven项目中War包的打包及依赖方式

    两个web项目之间的依赖引用方式.Web项目之间,通过war包的方式进行引用的.例如,有两个项目,puzzle-web和puzzle-web-demo,两个均是web项目,puzzle-web-dem ...

  3. sbt的assembly插件使用(打包所有依赖)

    1.sbt是什么 对于sbt 我也是小白, 为了搞spark看了一下scala,学习scala时指定的构建工具就是sbt(因为sbt也是用scala开发的嘛),起初在我眼里就是一个maven(虽然ma ...

  4. 【maven】之打包war依赖子项目jar

    比如 p-common p-core p-dao p-service p-web service项目依赖dao,dao依赖core和common,web依赖service 在使用maven tomca ...

  5. Maven项目打包jar依赖外部jar

    有时候我们想要做一些java 的小程序,需要把打包成jar,单独执行,做一个maven项目,maven非常方便,有自动打包成jar的插件,但是有时候我们的项目可能会依赖其他的jar包,所以非常麻烦. ...

  6. maven打包加入依赖包以及加入本地依赖包的方法

    Maven引入本地Jar包并打包进War包中 1.概述 在平时的开发中,有一些Jar包因为种种原因,在Maven的中央仓库中没有收录,所以就要使用本地引入的方式加入进来. 2. 拷贝至项目根目录 项目 ...

  7. Spring Boot 打包分离依赖 JAR 和配置文件

    <properties> <java.version>1.8</java.version> <project.build.sourceEncoding> ...

  8. maven 打包添加依赖

    1.将依赖与自己的代码打入同一个jar包 只需在pom中添加如下plugin 在include 中添加需要的依赖,在exclude 中添加不需要的依赖 <groupId>org.apach ...

  9. spring boot打包,依赖、配置文件分离,拷贝启动脚本

    一.最终打包的目录结构 二.项目结构 三.开始 1.最终打包的目录,可根据自己需要修改. <properties> <mzservice.path>${project.buil ...

随机推荐

  1. Spring Boot 集成Shiro和CAS

    Spring Boot 集成Shiro和CAS 标签: springshirocas 2016-01-17 23:03 35765人阅读 评论(22) 收藏 举报  分类: Spring(42)  版 ...

  2. Android -- Interpolator

    Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等. ...

  3. 【Scala】Scala-循环与遍历

    Scala-循环与遍历 scala for 1000_百度搜索 Scala 2.8的for表达式:性能与运行顺序的改进 - 51CTO.COM scala List集合的用法 - CSDN博客

  4. Redis2.2.2源码学习——Server&Client链接的建立以及相关Event

    Redis中Server和User建立链接(图中的client是服务器端用于描述与客户端的链接相关的信息) Redis Server&Client链接的建立时相关Event的建立(图中的cli ...

  5. iOS - 切换图片/clip subview/iCarousel

    源代码:点击打开链接 这个图片展示的时候,我只想让它在蓝色的view上展示..就需要去设置view的一个属性clip subview..把这个属性打勾...view有个clip subview属性,选 ...

  6. NLP常用信息资源

    ACL Anthology,囊括了ACL,EMNLP,CL等NLP领域重要会议和期刊的论文.http://www.aclweb.org/anthology-new/ LDC: The Linguist ...

  7. AI-终极算法-神经网络(连结学派)

  8. Java-JUC(十一):线程8锁

    题目: 判断以下8种情况,输出的内容 题目一:一个Number实例对象number,两个非静态同步方法getOne,getTwo,两个线程打印输出(一个线程调用number.getOne,另外一个线程 ...

  9. Android 演示 DownloadManager——Android 下载 apk 包并安装

    本文内容 环境 项目结构 演示下载 参考资料 本文是 github 上 Trinea-Android-common 和 Trinea-Android-Demo 项目的一部分,将下载部分分离出来,看看如 ...

  10. guava 学习笔记 瓜娃(guava)的API快速熟悉使用

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...