在TensorFlow中的不同变量范围下节省/还原权重



我一直在尝试研究模型/权重一段时间,但我仍然无法完全掌握它。我觉得我想做的应该很简单,但是我还没有找到解决方案。

最终目标是通过审计网络的集合进行转移LAERNING。我将模型/层写为类,因此用于节省权重和还原的类方法是理想的。

示例:如果我有图形,则功能> a> b>标签,a和b是子网络,我想节省和/或恢复这些部分的权重。假设我已经有了训练有素的权重,但是可变范围现在有所不同,我将如何恢复我从不同的培训课程中训练的权重?在训练这个新图的结束时,我希望我的新A权重1个目录,新的B重量的1个目录以及完整图的1个目录(我可以处理完整的图位)。

我很有可能会一直忽略解决方案,但是储蓄模型的文献很差。

希望我已经很好地解释了场景。

您可以使用tf.train.init_from_checkpoint

进行此操作

定义您的模型

def model_fn():
    with tf.variable_scope('One'):
        layer = any_tf_layer
    with tf.variable_scope('Two'):
        layer = any_tf_layer 

检查点文件中的输出变量名称

vars = [i[0] for i in tf.train.list_variables(ckpt_file)]

然后,您可以创建分配映射以仅加载模型中定义的变量。您也可以为已恢复的变量分配新名称

 map = {variable.op.name: variable for variable in tf.global_variables() if variable.op.name in vars}

此行放置在会话之前或外部模型功能以用于估算器API

tf.train.init_from_checkpoint(ckpt_file, map)

https://www.tensorflow.org/api_docs/python/tf/train/init_from_checkpoint

您也可以使用tf.train.Saver做到这一点首先,您需要知道变量的名称

vars_dict = {}
for var_current in tf.global_variables():
    print(var_current)
    print(var_current.op.name) # this gets only name
for var_ckpt in tf.train.list_variables(ckpt):
    print(var_ckpt[0]) this gets only name

当您知道所有变量的确切名称时,您可以分配所需的任何值,前提是变量具有相同的形状和dtype。因此要获得字典

vars_dict[var_ckpt[0]) = tf.get_variable(var_current.op.name, shape) # remember to specify shape, you can always get it from var_current 
saver = tf.train.Saver(vars_dict)

看看我对类似问题的其他答案如何在TensorFlow中恢复当前模型的审计检查点?

最新更新