TensorFlow 模型保存与恢复总结(微调、微改已有模型)

一张图对应一个计算流程,图与图之间相互独立

session 可以看做一个管理内存的东西,只有通过session才能对图进行运算,因为只有session有内存,没有内存怎么能运行呢,一个session智能对一个图进行计算,创建session时可以指定图,不指定则使用默认的图

saver类来进行保存,保存时需要指定session,因此,saver类的功能只是负责保存session,而session对应着图与变量,因此,可以知道saver所保存的图与变量

注意,创建saver时可以指定变量列表,从而指定要保存的变量有哪些,如果不指定则默认保存所有变量

然后给出保存的路径就可以保存了,很方便

模型恢复时,有两种可能,

1、恢复参数,也恢复图
恢复图则在创建saver时要指定.meta文件的路径

2、恢复参数,不恢复图
不恢复图则不需要指定.meta文件,在恢复时直接传递模型路径就可以

这里要注意,如果没有恢复图,则在恢复变量时,需要在代码中手动创建与之前一样的图,如果有新的op,则需要指定要恢复的参数列表,不然的话就会报错,因为在原有模型文件里找不到新定义的op,我们改别人的模型一般用的是这个,不过我们构建的图可以与原来不同,只要是我们定义的变量与原图一致就可以,体现在名字,变量类型,大小,形状

如果是恢复图了话,我们可以通过名字来获取原图的变量,然后用于新图的计算,而原图的代码不用必须有,这是要注意,原图的变量必须要有名字,因为我们是通过变量的名字来找到变量的

总结一下,不导入原图,则在现有代码里要有原来变量的声明,名字,变量类型,大小,形状要和原来一样,然后恢复时要传入这些变量,这样这些变量就恢复了,我们要的就是这些变量的值,至于说要进行什么计算,我们可以重新构造,(训练不就是为了得到这些变量的值吗)

如果说导入了原图,则我们获取原变量的方式直接通过名字就可以,不需要在代码里重新声明变量,如

saver = tf.train.import_meta_graph("./my/my.ckpt.meta")
graph = tf.get_default_graph()
b = graph.get_tensor_by_name("b:0")
这样就获得了原变量,同理可以获取op,然后重新利用这个变量做我们需要的计算

这里注意,训练时指定要训练变量的列表,就可以保证哪些变量可以被改变,而哪些变量不需要被改变,很方便,而一个快速获取需要变量的方法是根据TF 的api 根据命名空间来获得。


(写得有点乱,转载请注明出处。)












你可能感兴趣的:(深度学习)