TensorFlow,将两个检查点值合并为一个并还原

TensorFlow,将两个检查点值合并为一个并还原,tensorflow,Tensorflow,我有两个具有相同体系结构的模型(A和B),例如,A和B都有相同的变量名称和模型设置 ['A1\B1\C1','A2\B2\C2','A3\B3\C3'] 我有A和B的检查点文件,我想将A中的['A1\B1\C1',A2\B2\C2']与B int中的'A3\B3\C3'组合到检查点文件中,并将其还原到模型A。如何使用saver.restor()?您可以从检查点使用init\u执行此操作。定义当前模型后,创建分配图 dir = 'path_to_A_and_B_checkpoint_files'

我有两个具有相同体系结构的模型(A和B),例如,A和B都有相同的变量名称和模型设置

['A1\B1\C1','A2\B2\C2','A3\B3\C3']

我有A和B的检查点文件,我想将A中的
['A1\B1\C1',A2\B2\C2']
与B int中的
'A3\B3\C3'
组合到检查点文件中,并将其还原到模型A。如何使用
saver.restor()

您可以从检查点使用init\u执行此操作。定义当前模型后,创建分配图

dir = 'path_to_A_and_B_checkpoint_files'
vars_to_load = [i[0] for i in tf.train.list_variables(dir)]
assignment_map = {variable.op.name: variable for variable in tf.global_variables() if variable.op.name in vars_to_restore}
这将创建一个dict,其中当前图形中的变量作为键,检查点中的变量作为值

tf.train.init_from_checkpoint(dir, assignment_map)
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  #do_usual_stuff

此函数放在声明会话之前,并替代
saver.restore

独自回答我的问题

将tensorflow导入为tf
从tensorflow.python导入pywrap\u tensorflow
def加载权重(ckpt路径、前缀列表):
变量权重={}
reader=pywrap\u tensorflow.NewCheckpointReader(ckpt\u路径)
var_to_shape_map=reader.get_variable_to_shape_map()
对于已排序的键(变量到形状映射):
对于前缀列表中的_pref:
如果使用键启动(\u pref):
变量权重[key+':0']=读取器。获取张量(key)
返回变量权重
#构建模型
...
#初始变量
sess.run(tf.global\u variables\u initializer())
#恢复模型
saver.restore(sess,load\u dir\u A)
前缀=['A3\B3\C3']
#从B的ckpt获取权重
B_权重=加载权重(加载方向,前缀)
#将权重从B分配给A
assign\u ops=[tf.assign(tf.get\u default\u graph().get\u tensor\u by\u name(\u name,\u value)
对于_name,_对手权重中的值。items()]
sess.run(分配操作)

combine的确切含义是什么?我的意思是将后者的值设置为前者。谢谢你的回答。我得到了A和B的模型权重文件。我想将B的
'A3\B3\C3'
中的值设置为A的
'A3\B3\C3'
中的值,并恢复A修改后的模型权重文件。您的代码
sess.run(tf.global_variables_initializer())
可以将模型的权重重置为一些随机初始值。
assignment_map={variable.op.name:tf.global_variables()中变量的变量如果variable.op.name在vars_to_restore}
我认为在我的情况下,它只能还原B的
'A3\B3\C3'
。你能检查一下吗?
init\u from\u checkpoint
覆盖了标准的初始值设定项,所以这不会是一个问题。对于特定的变量,我认为你是对的。也许你必须手动定义赋值映射,以便匹配p中需要的所有变量顺序。我看看能做些什么。谢谢。我发现这个函数可以帮助我提取变量名和权重,但是,我发现返回的名称不同。我用代码问了一个新问题: