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 ...
随机推荐
- GPS精度因子(GDOP,PDOP,HDOP,VDOP,TDOP)
PDOP:位置精度因子(Position Dilution of Precision),直译为“精度强弱度”,通常翻译为“相对误差”.具体含义是:由于观测成果的好坏与被测量的人造卫星和接收仪间的几何形 ...
- Laravel应用性能调优
这次性能测试方案中用到的优化技巧主要基于 Laravel 框架本身及其提供的工具. 关闭应用debugapp.debug=false 缓存配置信息php artisan config:cache 缓存 ...
- 【转】vim中多标签和多窗口的使用
原文:https://my.oschina.net/kutengshe/blog/464602 ---------------------------------------------------- ...
- nginx不浏览直接下载文件
当我们使用Nginx时,如果要让一些附件比如txt,pdf,doc等不直接在浏览器打开,而弹出另存为的对话框(也就是下载),则可以在nginx里添加如下配置: location /{if ($requ ...
- awk学习 (good)
原文:http://blog.chinaunix.net/uid-23302288-id-3785105.html awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓 ...
- HTTPS证书撤销
如果浏览器信息被拦截,可以选择清洗掉之前的证书 关闭浏览器,在CMD中输入命令 certutil -urlcache * certutil -urlcache * delete certutil -u ...
- 【Python】torrentParser1.02
#------------------------------------------------------------------------------------ # torrentParse ...
- 使用visual studio code调试php代码
这回使用visual studio code折腾php代码的调试,又是一顿折腾,无论如何都进不了断点.好在就要放弃使用visual studio code工具的时候,折腾好了,汗~ 这里把步骤记录下来 ...
- 动态加载jar包(一)
一.编写被调用的类 package com.qunar.helloworld; public class HelloWorld { public String sayHello(){ return ( ...
- mysql主从备份功能配置与測试
在高訪问量服务环境下,单机配置mysql服务将无法满足频繁快速的数据读写操作. 一旦mysql出现故障造成数据丢失.无法恢复. 因此.在mysql服务上启用主从备份功能,支持读写分离技术.最靠可的是搭 ...