这篇文章主要为大家介绍了深度学习神经网络如何将训练得到的模型保存下来方便下次直接使用。为了让训练结果可以复用,需要将训练好的神经网络模型持久化
之前的笔记里实现了回归分类、简单的含有一个隐层的神经网络、卷积神经网络等等,但是这些代码在训练完成之后就直接退出了,并没有将训练得到的模型保存下来方便下次直接使用。为了让训练结果可以复用,需要将训练好的神经网络模型持久化,这就是这篇笔记里要写的东西。
提供了一个非常简单的API,即tf.train.Saver类来保存和还原一个神经网络模型。
下面代码给出了保存模型的方法:
更多关于网络模型保存和读取的资料请关注小编并按上方获取方式获取!
注:Saver方法已经发生了更改,现在是V2版本,tf.train.Saver(=tf.train..V1)括号里加入该参数可继续使用V1,但会报,可忽略。若使用saver = tf.train.Saver()则默认使用当前的版本(V2),保存后在save这个文件夹中会出现4个文件,比V1版多出model.ckpt.data-00000-of-00001这个文件,这点感谢评论里那位朋友指出。至于这个文件的含义到目前我仍不是很清楚,也没查到具体资料,年底开源到现在很多类啊函数都一直发生着变动,或被更新或被弃用,可能一些代码在当时是没问题的,但过了一大段时间后再跑可能就会报错,在此注明事件时间:2017.4.30
这段代码中,通过saver.save函数将模型保存到了save/model.ckpt文件中,这里代码中指定路径为”save/model.ckpt”,也就是保存到了当前程序所在文件夹里面的save文件夹中。
模型会保存在后缀为.ckpt的文件中。保存后在save这个文件夹中会出现3个文件,因为会将计算图的结构和图上参数取值分开保存。
文件保存了一个目录下所有的模型文件列表,这个文件是tf.train.Saver类自动生成且自动维护的。在 文件中维护了由一个tf.train.Saver类持久化的所有模型文件的文件名。当某个保存的模型文件被删除时,这个模型所对应的文件名也会从文件中删除。中内容的格式为 .
model.ckpt.meta文件保存了计算图的结构,可以理解为神经网络的网络结构
通过元图()来记录计算图中节点的信息以及运行计算图中节点所需要的元数据。中元图是由 定义的。 中的内容构成了持久化时的第一个文件。保存 信息的文件默认以.meta为后缀名,文件model.ckpt.meta中存储的就是元图数据。
model.ckpt文件保存了程序中每一个变量的取值,这个文件是通过格式存储的,可以大致理解为就是一个(key,value)列表。model.ckpt文件中列表的第一行描述了文件的元信息,比如在这个文件中存储的变量列表。列表剩下的每一行保存了一个变量的片段,变量片段的信息是通过 定义的。类型中保存了变量的名称、当前片段的信息以及变量取值。提供了tf.train.类来查看model.ckpt文件中保存的变量信息。如何使用tf.train.类这里不做说明,自查。
下面代码给出了加载模型的方法:
可以对比一下v1、v2的值是随机初始化的值还是和之前保存的值是一样的?
运行结果:
这段加载模型的代码基本上和保存模型的代码是一样的。也是先定义了计算图上所有的运算,并声明了一个tf.train.Saver类。两段唯一的不同是,在加载模型的代码中没有运行变量的初始化过程,而是将变量的值通过已经保存的模型加载进来。
也就是说使用完成了一次模型的保存和读取的操作。
如果不希望重复定义图上的运算,也可以直接加载已经持久化的图:
运行程序,输出:
[[ 0. 1.]]
有时可能只需要保存或者加载部分变量。
比如,可能有一个之前训练好的5层神经网络模型,但现在想写一个6层的神经网络,那么可以将之前5层神经网络中的参数直接加载到新的模型,而仅仅将最后一层神经网络重新训练。
为了保存或者加载部分变量,在声明tf.train.Saver类时可以提供一个列表来指定需要保存或者加载的变量。比如在加载模型的代码中使用saver = tf.train.Saver([v1])命令来构建tf.train.Saver类,那么只有变量v1会被加载进来。
以上就是深度学习神经网络模型的保存和读取的详细内容,更多关于网络模型保存和读取的资料请关注小编并按下方获取方式获取!