一、保存:
graph_util.convert_variables_to_constants 可以把当前session的计算图串行化成一个字节流(二进制),这个函数包含三个参数:参数1:当前活动的session,它含有各变量
参数2:GraphDef 对象,它描述了计算网络
参数3:Graph图中需要输出的节点的名称的列表
返回值:精简版的GraphDef 对象,包含了原始输入GraphDef和session的网络和变量信息,它的成员函数SerializeToString()可以把这些信息串行化为字节流,然后写入文件里:
constant_graph = graph_util.convert_variables_to_constants( sess, sess.graph_def , ['sum_operation'] ) with open( pbName, mode='wb') as f: f.write(constant_graph.SerializeToString())
需要指出的是,如果原始张量(包含在参数1和参数2中的组成部分)不参与参数3指定的输出节点列表所指定的张量计算的话,这些张量将不会存在返回的GraphDef对象里,也不会被串行化写入pb文件。
二、恢复:
恢复时,创建一个GraphDef,然后从上述的文件里加载进来,接着输入到当前的session:
graph0 = tf.GraphDef() with open( pbName, mode='rb') as f: graph0.ParseFromString( f.read() ) tf.import_graph_def( graph0 , name = '' )
三、代码:
import tensorflow as tf from tensorflow.python.framework import graph_util pbName = 'graphA.pb' def graphCreate() : with tf.Session() as sess : var1 = tf.placeholder ( tf.int32 , name='var1' ) var2 = tf.Variable( 20 , name='var2' )#实参name='var2'指定了操作名,该操作返回的张量名是在 #'var2'后面:0 ,即var2:0 是返回的张量名,也就是说变量 # var2的名称是'var2:0' var3 = tf.Variable( 30 , name='var3' ) var4 = tf.Variable( 40 , name='var4' ) var4op = tf.assign( var4 , 1000 , name = 'var4op1' ) sum = tf.Variable( 4, name='sum' ) sum = tf.add ( var1 , var2, name = 'var1_var2' ) sum = tf.add( sum , var3 , name='sum_var3' ) sumOps = tf.add( sum , var4 , name='sum_operation' ) oper = tf.get_default_graph().get_operations() with open( 'operation.csv','wt' ) as f: s = 'name,type,output\n' f.write( s ) for o in oper: s = o.name s += ','+ o.type inp = o.inputs oup = o.outputs for iip in inp : s #s += ','+ str(iip) for iop in oup : s += ',' + str(iop) s += '\n' f.write( s ) for var in tf.global_variables(): print('variable=> ' , var.name) #张量是tf.Variable/tf.Add之类操作的结果, #张量的名字使用操作名加:0来表示 init = tf.global_variables_initializer() sess.run( init ) sess.run( var4op ) print('sum_operation result is Tensor ' , sess.run( sumOps , feed_dict={var1:1}) ) constant_graph = graph_util.convert_variables_to_constants( sess, sess.graph_def , ['sum_operation'] ) with open( pbName, mode='wb') as f: f.write(constant_graph.SerializeToString()) def graphGet() : print("start get:" ) with tf.Graph().as_default(): graph0 = tf.GraphDef() with open( pbName, mode='rb') as f: graph0.ParseFromString( f.read() ) tf.import_graph_def( graph0 , name = '' ) with tf.Session() as sess : init = tf.global_variables_initializer() sess.run(init) v1 = sess.graph.get_tensor_by_name('var1:0' ) v2 = sess.graph.get_tensor_by_name('var2:0' ) v3 = sess.graph.get_tensor_by_name('var3:0' ) v4 = sess.graph.get_tensor_by_name('var4:0' ) sumTensor = sess.graph.get_tensor_by_name("sum_operation:0") print('sumTensor is : ' , sumTensor ) print( sess.run( sumTensor , feed_dict={v1:1} ) ) graphCreate() graphGet()
四、保存pb函数代码里的操作名称/类型/返回的张量:
operation name operation type output var1 Placeholder Tensor("var1:0" dtype=int32) var2/initial_value Const Tensor("var2/initial_value:0" shape=() dtype=int32) var2 VariableV2 Tensor("var2:0" shape=() dtype=int32_ref) var2/Assign Assign Tensor("var2/Assign:0" shape=() dtype=int32_ref) var2/read Identity Tensor("var2/read:0" shape=() dtype=int32) var3/initial_value Const Tensor("var3/initial_value:0" shape=() dtype=int32) var3 VariableV2 Tensor("var3:0" shape=() dtype=int32_ref) var3/Assign Assign Tensor("var3/Assign:0" shape=() dtype=int32_ref) var3/read Identity Tensor("var3/read:0" shape=() dtype=int32) var4/initial_value Const Tensor("var4/initial_value:0" shape=() dtype=int32) var4 VariableV2 Tensor("var4:0" shape=() dtype=int32_ref) var4/Assign Assign Tensor("var4/Assign:0" shape=() dtype=int32_ref) var4/read Identity Tensor("var4/read:0" shape=() dtype=int32) var4op1/value Const Tensor("var4op1/value:0" shape=() dtype=int32) var4op1 Assign Tensor("var4op1:0" shape=() dtype=int32_ref) sum/initial_value Const Tensor("sum/initial_value:0" shape=() dtype=int32) sum VariableV2 Tensor("sum:0" shape=() dtype=int32_ref) sum/Assign Assign Tensor("sum/Assign:0" shape=() dtype=int32_ref) sum/read Identity Tensor("sum/read:0" shape=() dtype=int32) var1_var2 Add Tensor("var1_var2:0" dtype=int32) sum_var3 Add Tensor("sum_var3:0" dtype=int32) sum_operation Add Tensor("sum_operation:0" dtype=int32)以上这篇Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]