Tensorflow结点打包和依赖控制
深度学习库能够充分发挥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结点打包和依赖控制的更多相关文章
- gradle 打包所有依赖 Invalid signature file digest for Manifest main attributes(转)
1.打包所有依赖: // 指定main函数的类 jar { manifest { attributes "Main-Class": "com.baeldung.fatja ...
- Maven项目中War包的打包及依赖方式
两个web项目之间的依赖引用方式.Web项目之间,通过war包的方式进行引用的.例如,有两个项目,puzzle-web和puzzle-web-demo,两个均是web项目,puzzle-web-dem ...
- sbt的assembly插件使用(打包所有依赖)
1.sbt是什么 对于sbt 我也是小白, 为了搞spark看了一下scala,学习scala时指定的构建工具就是sbt(因为sbt也是用scala开发的嘛),起初在我眼里就是一个maven(虽然ma ...
- 【maven】之打包war依赖子项目jar
比如 p-common p-core p-dao p-service p-web service项目依赖dao,dao依赖core和common,web依赖service 在使用maven tomca ...
- Maven项目打包jar依赖外部jar
有时候我们想要做一些java 的小程序,需要把打包成jar,单独执行,做一个maven项目,maven非常方便,有自动打包成jar的插件,但是有时候我们的项目可能会依赖其他的jar包,所以非常麻烦. ...
- maven打包加入依赖包以及加入本地依赖包的方法
Maven引入本地Jar包并打包进War包中 1.概述 在平时的开发中,有一些Jar包因为种种原因,在Maven的中央仓库中没有收录,所以就要使用本地引入的方式加入进来. 2. 拷贝至项目根目录 项目 ...
- Spring Boot 打包分离依赖 JAR 和配置文件
<properties> <java.version>1.8</java.version> <project.build.sourceEncoding> ...
- maven 打包添加依赖
1.将依赖与自己的代码打入同一个jar包 只需在pom中添加如下plugin 在include 中添加需要的依赖,在exclude 中添加不需要的依赖 <groupId>org.apach ...
- spring boot打包,依赖、配置文件分离,拷贝启动脚本
一.最终打包的目录结构 二.项目结构 三.开始 1.最终打包的目录,可根据自己需要修改. <properties> <mzservice.path>${project.buil ...
随机推荐
- Maven WEB 项目使用ProGuard进行混淆,最佳解决方案
Maven WEB 项目使用ProGuard进行混淆,最佳解决方案 近期公司的Android项目做了混淆,虽说对于保护代码并不是100%的,但混淆后的代码可以使那些不法份子难以阅读,这样也能对代码的保 ...
- (转)C#中的委托(Delegate)和事件(Event)
转自:http://blog.chinaunix.net/uid-576762-id-2733751.html 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...
- Python操作记录
1.写入中文出错,需要执行 reload(sys) sys.setdefaultencoding('utf8') 2.json.dump中文写入为\xxxx ensure_ascii=False
- 自己定义View Layout过程 - 最易懂的自己定义View原理系列(3)
前言 自己定义View是Android开发人员必须了解的基础 网上有大量关于自己定义View原理的文章.但存在一些问题:内容不全.思路不清晰.无源代码分析.简单问题复杂化等等 今天,我将全面总结自己定 ...
- Android 关于 ActionBarSherlock 的使用
原文地址 本文内容 使用 主题化 ActionBarSherlock 演示项目 本文 ActionBarSherlock 简单演示 最近一个星期被 actionsherlock 搞得很不爽(光去足疗店 ...
- logstash启动脚本
1 nohup ./redis-server 1>log.log 2>error.log & 2 nohup ./elasticsearch -f & 3 nohup ...
- UML关系(泛化,实现,依赖,关联(聚合,组合))
http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html UML类图关系(泛化 .继承.实现.依赖.关联.聚合.组合) 继承.实现.依赖. ...
- 从头认识java-15.7 Map(7)-TreeMap与LinkedHashMap
这一章节我们来讨论一下Map两个比較经常使用的实现:TreeMap与LinkedHashMap. 1.TreeMap 特性:依照key来排序 package com.ray.ch14; import ...
- Android Studio 之 Launch AVD 时" Intel HAXM is required to run this AVD, VT-x is disabled in BIOS; "
问题描述:Launch AVD 时弹窗信息" Intel HAXM is required to run this AVD, VT-x is disabled in BIOS; " ...
- 机器学习-分类器-级联分类器训练(Train CascadeClassifier )
一.简介: adaboost分类器由级联分类器构成,"级联"是指最终的分类器是由几个简单分类器级联组成.在图像检测中,被检窗口依次通过每一级分类器,这样在前面几层的检测中大部分的候 ...