Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算。TensorFlow的运行机制属于“定义”和“运行”相分离。模型的构建只是至关于定义了一个图结构(表明一个计算任务),图中有多个操做节点,每一个节点能够有一个或多个tensor做为输入,也会输出1个或多个tensor,只有经过session启动一个会话,并经过feed机制把数据填充进去,数据以tensor的形式进行流动,整个计算任务才能被启动。html
用with关键字在程序结束以后会自动关闭python
对TensorFlow中图的理解git
一个操做对象(Operation)是TensorFlow图中的一个节点, 能够接收0个或者多个输入Tensor, 而且能够输出0个或者多个Tensor,Operation对象是经过op构造函数(如tf.matmul())建立的。github
具体参考:数组
https://www.jianshu.com/p/b547c163e202session
https://blog.csdn.net/sinat_26745777/article/details/84350681框架
和图相关的经常使用函数函数
https://blog.csdn.net/lenbow/article/details/52181159学习
class tf.Graph tensorflow中的计算以图数据流的方式表示,一个图包含一系列表示计算单元的操做对象以及在图中流动的数据单元以tensor对象表现url
tf.Graph() 创建一个空图
tf.Graph.as_default() 一个将某图设置为默认图,并返回一个上下文管理器,若是不显式添加一个默认图,系统会自动设置一个全局的默认图。所设置的默认图,在模块范围内所定义的节点都将默认加入默认图中
tf.Graph.as_graph_def(from_version=None, add_shapes=False) 返回一个图的序列化的GraphDef表示,序列化的GraphDef能够导入至另外一个图中(使用 import_graph_def()) #在把图进行pb封装时会用到
tf.reset_default_graph() #重置默认图,加载图之间应该先重置默认图,由于不重置在封装多个图时可能会加载别人的图
tf.Graph.get_operation_by_name(name) 根据名称返回操做节点 tf.Graph.get_operation_by_name(name).output[0] 得到相应名称操做节点其输出tensor中为0的tensor
tf.Graph.get_tensor_by_name(name) 根据名称返回tensor数据
因此访问计算图中的V1节点,就只能使用tf.get_default_graph().get_tensor_by_name("v1:0")的方式。
不少人可能并不理解这个:0,这是一个operation的输出。也就是说变量节点的输出只有一个,因此用0表示引用计算图中这个变量节点的输出tensor。
tf.Graph.get_operations() 返回图中的操做节点列表
加载持久化模型的方式
结合:http://www.mamicode.com/info-detail-2424278.html
第一种:经过saver加载saver = tf.train.Saver() saver.restore
经过这种方式加载须要注意
1)程序前面得有 Variable 供 save or restore 才不报错不然会提示没有可保存的变量
2)这种方式只是持久化模型中变量的值加载到当前代码计算图中的变量中去。属于当前代码计算图已经定义,所以还必须在加载以前建立模型,变量是当前代码计算图中变量集合的一个子集,必须是一种严格包含的关系。
第二种:经过import_meta_graph
这种方式彻底不容许当前代码计算图已经定义的变量节点和要加载的持久化模型中的节点存在冲突,由于它不只加载参数还会加载整个图结构。
第三种:使用pb文件的方式。
即便持久化模型中的变量节点和当前代码计算图中定义的变量节点发生冲突,也没有问题,没有任何关系。由于pb文件的方式加载进来的计算图,会所有加上import/前缀。也就是说,从命名空间上就隔开了这种冲突。因此,使用别人的模型,最好的方式就是用pb文件。由于不会有冲突的可能!
可是,有一个弊端就是,import命名空间下的变量不能参与到当前的训练
同时,你使用v1=tf.get_variable(name="v1",shape=[1])方式,会在当前代码的计算图中生成一个新的变量节点V1_1,并不是加载的持久化模型中的变量节点V1。此时,就会出现函数功能失效。也就是,你但愿调用get_variable函数使得:python的变量v1和计算图中的变量节点v1是绑定的,可是状况并不是如此,绑定的是变量节点v1_1。
因此访问计算图中的V1节点,就只能使用tf.get_default_graph().get_tensor_by_name("v1:0")的方式。
封装成pb文件的好处:
一、它具备语言独立性,可独立运行,封闭的序列化格式,任何语言均可以解析它,它容许其余语言和深度学习框架读取、继续训练和迁移 TensorFlow 的模型。
二、实现了建立模型与使用模型的解耦。
三、保存为 PB 文件时候,模型的变量都会变成固定的,致使模型的大小会大大减少。
四、避免形成命名的冲突。