Python 在不同的图形中还原tf变量

Python 在不同的图形中还原tf变量,python,tensorflow,Python,Tensorflow,我想使用我的预训练可分离卷积,它是另一个模型中另一个可分离卷积中更大模块的一部分。 在经过培训的模块中,我尝试了 with tf.variable_scope('sep_conv_ker' + str(input_shape[-1])): sep_conv2d = tf.reshape( tf.layers.separable_conv2d(inputs_flatten,input_shape[-1] , [1,input

我想使用我的预训练可分离卷积,它是另一个模型中另一个可分离卷积中更大模块的一部分。 在经过培训的模块中,我尝试了

with tf.variable_scope('sep_conv_ker' + str(input_shape[-1])):
            sep_conv2d = tf.reshape(
            tf.layers.separable_conv2d(inputs_flatten,input_shape[-1] , 
            [1,input_shape[-2]]
            trainable=trainable),
            [inputs_flatten.shape[0],1,input_shape[-1],INNER_LAYER_WIDTH]) 

内部sess.run

但我无法理解何时以及如何将权重加载到另一个模块中的可分离卷积,它有不同的名称和范围, 此外,当我使用定义的tf.layer时,是否意味着我需要访问新图表中的每个单独权重并分配它

我目前的解决方案不起作用,我认为权重是在赋值之后被初始化的,而且,加载一个全新的图只是为了几个权重似乎很奇怪,不是吗

        ###IN THE OLD GRAPH###
        all_variables = tf.trainable_variables()
        scope1_variables = tf.contrib.framework.filter_variables(all_variables, include_patterns=['sep_conv_ker'])
        vars = dict((var.op.name.split("/")[-1] + str(idx), var) for idx,var in enumerate(scope1_variables))
        sep_conv_weights_saver = tf.train.Saver(vars, sharded=True, max_to_keep=20)
在新图中,函数基本上从旧图中获取变量并分配它们,加载元图是多余的

def load_pretrained(sess):
    sep_conv2d_vars = [var for var in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES) if ("sep_conv_ker" in var.op.name)]
    var_dict = dict((var.op.name.split("/")[-1] + str(idx), var) for idx, var in enumerate(sep_conv2d_vars))
    new_saver = tf.train.import_meta_graph(
        tf.train.latest_checkpoint('log/train/sep_conv_ker/global_neighbors40/init_weights') + '.meta')
    # saver = tf.train.Saver(var_list=var_dict)
    new_saver.restore(sess,
                      tf.train.latest_checkpoint('log/train/sep_conv_ker/global_neighbors40/init_weights'))

    graph = tf.get_default_graph()
    sep_conv2d_trained = dict(("".join(var.op.name.split("/")[-2:]),var) for var in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES) if ("sep_conv_ker_init" in var.op.name))
    for var in sep_conv2d_vars:
        tf.assign(var,sep_conv2d_trained["".join(var.op.name.split("/")[-2:])])

您需要确保变量文件和加载变量的图形中的变量相同。您可以编写一个脚本来转换变量名

使用tf.contrib.framework.list_variablesckpt,您可以找出检查点中有哪些形状的变量,并使用新名称创建相应的变量。我相信,您可以编写一个正则表达式来修复这些名称和正确的形状。 然后使用tf.contrib.framework.load\u checkpointpt assign ops tf.assignvar加载原始变量,加载后将使用保存的值为变量分配新名称。 在会话中运行分配操作。 保存新变量。 最起码的例子:

范围回归中的原始模型变量:

导入tensorflow作为tf x=tf.placeholder tf.float32,[None,3] 回归=tf.layers.densex,1,name=回归 session=tf.session session.runtf.global\u变量\u初始值设定项 saver=tf.train.Savertf.trainable_变量 saver.savesession“./型号” 重命名脚本:

导入tensorflow作为tf 分配操作=[] reader=tf.contrib.framework.load\u checkpoint./model 对于名称,请在tf.contrib.framework.list_变量中选择形状。/model: new_name=name.replaceReturnal/,foo/bar/ 新建变量=tf.get变量新建名称、形状 assign_ops.appendtf.assignnew_var,reader.get_tensorname session=tf.session saver=tf.train.Savertf.trainable_变量 session.runassign\u ops saver.savesession,'./已重命名模型' 在模型中加载重命名变量,并在分数foo/bar中加载相同的变量:

导入tensorflow作为tf 使用tf.variable_scopefoo: x=tf.placeholder tf.float32,[None,3] 回归=tf.layers.densex,1,name=bar session=tf.session session.runtf.global\u变量\u初始值设定项 saver=tf.train.Savertf.trainable_变量 saver.restoresession,'./模型重命名'
因为这些图是不同的,所以当我试图从ckptYes加载时,我确实得到了“当前图和图之间的不匹配”。我的建议是编写一个单独的脚本,该脚本将根据变量在新图形中的命名方式重命名保存的变量,将它们保存到一个文件中,并使用不同的新图形为它们加载一个脚本。你还需要确保两边的储存器只包含你感兴趣的变量。请看我编辑的问题,我想我按照你的建议做了,但它会加载旧图的元图,我更喜欢只加载权重值。当我尝试在不加载元图的情况下使用ckpt调用saver时,我得到了与前面提到的不同的图形错误。如果您能显示一个非常有用的最小片段,如,即使在更改了权重名称之后,我也会发现这些图之间不匹配,我认为元数据会以其他方式比较权重和其他数据,而不仅仅是权重名称。我添加了一个最小示例。你根本不需要处理这些图表。如果您知道要传输的变量是什么,那么您只需要知道它们在原始模型和新模型中的名称。
        ###IN THE OLD GRAPH###
        all_variables = tf.trainable_variables()
        scope1_variables = tf.contrib.framework.filter_variables(all_variables, include_patterns=['sep_conv_ker'])
        vars = dict((var.op.name.split("/")[-1] + str(idx), var) for idx,var in enumerate(scope1_variables))
        sep_conv_weights_saver = tf.train.Saver(vars, sharded=True, max_to_keep=20)
def load_pretrained(sess):
    sep_conv2d_vars = [var for var in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES) if ("sep_conv_ker" in var.op.name)]
    var_dict = dict((var.op.name.split("/")[-1] + str(idx), var) for idx, var in enumerate(sep_conv2d_vars))
    new_saver = tf.train.import_meta_graph(
        tf.train.latest_checkpoint('log/train/sep_conv_ker/global_neighbors40/init_weights') + '.meta')
    # saver = tf.train.Saver(var_list=var_dict)
    new_saver.restore(sess,
                      tf.train.latest_checkpoint('log/train/sep_conv_ker/global_neighbors40/init_weights'))

    graph = tf.get_default_graph()
    sep_conv2d_trained = dict(("".join(var.op.name.split("/")[-2:]),var) for var in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES) if ("sep_conv_ker_init" in var.op.name))
    for var in sep_conv2d_vars:
        tf.assign(var,sep_conv2d_trained["".join(var.op.name.split("/")[-2:])])