计算图 graph
tensorflow,tensor就是数据,flow就是流,tensorflow就是数据流
tensorflow 是一个用计算图的形式来表示计算的编程系统,所有的数据和计算都会被转化成计算图上的一个节点,节点之间的边就是数据流(数据流动的轨迹)。
计算图的使用
1. 建立节点
2. 执行计算
计算图有两种形式
默认的计算图
tf 维护一个默认的计算图,
get_default_graph:获取默认计算图
graph:获取节点所属计算图
import tensorflow as tf a = tf.constant([1., 2.], name = 'a')
b = tf.constant([2., 3.], name = 'b')
result = a + b print(a.graph is tf.get_default_graph()) # True
数据本身就是节点,该节点的 graph 就是默认计算图
自定义计算图
tf.Graph 可以生成新的计算图,不同计算图之间的数据和计算不能共享
## g1
g1 = tf.Graph()
with g1.as_default():
# 在计算图 g1 中定义变量 “v” ,并设置初始值为 0。
v = tf.get_variable("v", [1], initializer = tf.zeros_initializer()) # 设置初始值为0,shape 为 1 ## g2
g2 = tf.Graph()
with g2.as_default():
# 在计算图 g2 中定义变量 “v” ,并设置初始值为 1。
v = tf.get_variable("v", [1], initializer = tf.ones_initializer()) # 设置初始值为1 # 在计算图 g1 中读取变量“v” 的取值
with tf.Session(graph = g1) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("", reuse=True):
print(sess.run(tf.get_variable("v"))) # [0.] # 在计算图 g2 中读取变量“v” 的取值
with tf.Session(graph = g2) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("", reuse=True):
print(sess.run(tf.get_variable("v"))) # [1.] ## g3
g3 = tf.Graph()
with g3.as_default():
# 在计算图 g2 中定义变量 “v” ,并设置初始值为 1。
v = tf.get_variable("v2", [1], initializer = tf.ones_initializer()) # 设置初始值为1 # 在计算图 g1 中读取变量“v” 的取值
with tf.Session(graph = g3) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("", reuse=True):
print(sess.run(tf.get_variable("v2"))) # [1.]
print(sess.run(tf.get_variable("v"))) # 报错 Variable v does not exist
可以看到 g3 无法调用 g2 中的变量v
计算图可以用来隔离张量和计算
计算图的操作
保存
g1 = tf.Graph()
with g1.as_default():
# 需要加上名称,在读取pb文件的时候,是通过name和下标来取得对应的tensor的
c1 = tf.constant(4.0, name='c1') with tf.Session(graph=g1) as sess1:
print(sess1.run(c1)) # 4.0 # g1的图定义,包含pb的path, pb文件名,是否是文本默认False
tf.train.write_graph(g1.as_graph_def(),'.','graph.pb',False)
读取
import tensorflow as tf#load graph
with tf.gfile.FastGFile("./graph.pb",'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name='') sess = tf.Session()
c1_tensor = sess.graph.get_tensor_by_name("c1:0")
c1 = sess.run(c1_tensor)
print(c1) # 4.0
穿插调用
g1 = tf.Graph()
with g1.as_default():
# 声明的变量有名称是一个好的习惯,方便以后使用
c1 = tf.constant(4.0, name="c1") g2 = tf.Graph()
with g2.as_default():
c2 = tf.constant(20.0, name="c2") with tf.Session(graph=g2) as sess1:
# 通过名称和下标来得到相应的值
c1_list = tf.import_graph_def(g1.as_graph_def(), return_elements = ["c1:0"], name = '')
print(sess1.run(c1_list[0]+c2)) # 24.0
指定计算图的运行设备
g = tf.Graph()
# 指定计算运行的设备
with g.device('/gpu:0'):
result = a + b
计算图资源管理
在一个计算图中,可以通过集合来管理不同的资源。
比如通过 tf.add_to_collection 将资源加入一个或多个集合中,然后通过 tf.get_collection 获取一个集合里的所有资源
参考资料:
https://www.cnblogs.com/q735613050/p/7632792.html
计算图 graph的更多相关文章
- tensorflow中创建多个计算图(Graph)
tf程序中,系统会自动创建并维护一个默认的计算图,计算图可以理解为神经网络(Neural Network)结构的程序化描述.如果不显式指定所归属的计算图,则所有的tensor和Operation都是在 ...
- Tensorflow计算模型 —— 计算图
转载自:http://blog.csdn.net/john_xyz/article/details/69053626 Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图 ...
- 【深度学习系列】PaddlePaddle可视化之VisualDL
上篇文章我们讲了如何对模型进行可视化,用的keras手动绘图输出CNN训练的中途结果,本篇文章将讲述如何用PaddlePaddle新开源的VisualDL来进行可视化.在讲VisualDL之前,我们先 ...
- 深度学习中batch normalization
目录 1 Batch Normalization笔记 1.1 引包 1.2 构建模型: 1.3 构建训练函数 1.4 结论 Batch Normalization笔记 我们将会用MNIST数 ...
- tensorflow+入门笔记︱基本张量tensor理解与tensorflow运行结构
Gokula Krishnan Santhanam认为,大部分深度学习框架都包含以下五个核心组件: 张量(Tensor) 基于张量的各种操作 计算图(Computation Graph) 自动微分(A ...
- Tensorflow会话Session
转载自: http://blog.csdn.net/Hanging_Gardens/article/details/72784392 https://www.cnblogs.com/hypnus-ly ...
- tensorflow (七) k-means
tensorflow基础暂不介绍 Python 相关库的安装 在进入正式聚类实验之前,我们还需要配置计算及画图需要用到相关支持包. 安装 seaborn: pip install seaborn 安装 ...
- tensorflow(1) 基础: 神经网络基本框架
1.tensorflow 的计算得到的是计算图graph import tensorflow as tf a=tf.constant([1.0,2.0]) b=tf.constant([3.0,4.0 ...
- TensorFlow迭代速度变慢的问题
最近用TensorFlow实现遗传算法(Genetic Algorithms),发现迭代速度越来越慢,用time.time()观察以后,发现每次迭代都要比上一次慢0.5秒左右,但是每次迭代的计算量是差 ...
随机推荐
- Android--------内存泄露工具LeakCanary
什么是内存泄露 一些对象有着有限的生命周期.当这些对象所要做的事情完成了,我们希望他们会被回收掉.但是如果有一系列对这个对象的引用,那么在我们期待这个对象生命周期结束的时候被收回的时候,它是不会被回收 ...
- genymotio安装apk包提示 ...abi ...cpu
下载 Genymotion-ARM-Translation_v1.1 (1).zip 地址:http://qc1.androidfilehost.com/dl/Q-YDDKt4QaFNvKh62ppO ...
- 安卓——BroadcastReceiver
package com.example.administrator.myapplication_reciver; import android.content.BroadcastReceiver; i ...
- ccf碰撞的小球
之前的代码有人运行不成功,自己又看了一下是输入变量顺序输入错了,现在是正确答案- #include<stdio.h> struct node{ int x; int dir; }; int ...
- OpenStack设计与实现5——RESTful API和WSGI
转https://segmentfault.com/a/1190000004361778 Tips:文章为拜读@xingjiarong 后有感而做的分享,先对作者表示感谢,附原文地址:http://b ...
- C++ string::size_type
从逻辑上讲,size()成员函数应该似乎返回整型数值,但事实上,size操作返回是string::size_type类型的值.string类类型和其他许多库类型都定义了一些配套类型(companion ...
- ActiveMQ producer 流量控制
http://activemq.apache.org/producer-flow-control.html 翻译: 流量控制是指:如果broker检测到destination的内存限制.temp文件限 ...
- ActiveMQ 到底是推还是拉?
http://activemq.apache.org/destination-options.html 1. consumer 的配置参数如下图: 配置consumer的示例: public void ...
- Oracle 如何循环查询结果集,进行新增或修改
Oracle的PL/SQL中怎样循环查询的结果集,然后根据查询结果进行判断,是新增或修改操作 loop循环例子 for item in (select a,b,c from table_a where ...
- js如何比较两个日期之间相差数(天、时、分、秒)
首先,我们模拟一个例子 引入js文件 <script type="text/javascript" src="jquery.min.js">< ...