在这篇文章中,我们来看一下如何保存和恢复TensorFlow模型,我们在此介绍一些最有用的方法,并提供一些例子。
假如深层神经网络模型的复杂度十分高的话,那么练习它或许需求适当长的一段时刻,当然这也取决于你具有的数据量,运转模型的硬件等等。在大多数情况下,你需求经过保存文件来保证你实验的稳定性,避免假如中止(或一个过错),你可以持续从没有过错的当地开端。
更重要的是,关于任何深度学习的结构,像TensorFlow,在成功的练习之后,你需求从头运用模型的学习参数来完结对新数据的猜测。
在这篇文章中,咱们来看一下怎么保存和康复TensorFlow模型,咱们在此介绍一些最有用的办法,并供给一些比如。
1. 首要咱们将快速介绍TensorFlow模型
TensorFlow的首要功用是经过张量来传递其根本数据结构类似于NumPy中的多维数组,而图表则表明数据核算。它是一个符号库,这意味着界说图形和张量将仅创立一个模型,而获取张量的具体值和操作将在会话(session)中履行,会话(session)一种在图中履行建模操作的机制。会话封闭时,张量的任何具体值都会丢掉,这也是运转会话后将模型保存到文件的另一个原因。
经过示例可以协助咱们更简略了解,所以让咱们为二维数据的线性回归创立一个简略的TensorFlow模型。
首要,咱们将导入咱们的库:
- importtensorflowastf
- importnumpyasnp
- importmatplotlib.pyplotasplt
- %matplotlibinline
下一步是创立模型。咱们将生成一个模型,它将以以下的方式预算二次函数的水平缓笔直位移:
- y=(x-h)^2+v
其间h是水平缓v是笔直的改变。
以下是怎么生成模型的进程(有关具体信息,请参阅代码中的注释):
- #Clearthecurrentgraphineachrun,toavoidvariableduplication
- tf.reset_default_graph()
- #Createplaceholdersforthexandypoints
- X=tf.placeholder("float")
- Y=tf.placeholder("float")
- #Initializethetwoparametersthatneedtobelearned
- h_est=tf.Variable(0.0,name='hor_estimate')
- v_est=tf.Variable(0.0,name='ver_estimate')
- #y_estholdstheestimatedvaluesony-axis
- y_est=tf.square(X-h_est)+v_est
- #DefineacostfunctionasthesquareddistancebetweenYandy_est
- cost=(tf.pow(Y-y_est,2))
- #Thetrainingoperationforminimizingthecostfunction.The
- #learningrateis0.001
- trainop=tf.train.GradientDescentOptimizer(0.001).minimize(cost)
在创立模型的进程中,咱们需求有一个在会话中运转的模型,而且传递一些实在的数据。咱们生成一些二次数据(Quadratic data),并给他们增加噪声。
- #Usesomevaluesforthehorizontalandverticalshift
- h=1
- v=-2
- #Generatetrainingdatawithnoise
- x_train=np.linspace(-2,4,201)
- noise=np.random.randn(*x_train.shape)*0.4
- y_train=(x_train-h)**2+v+noise
- #Visualizethedata
- plt.rcParams['figure.figsize']=(10,6)
- plt.scatter(x_train,y_train)
- plt.xlabel('x_train')
- plt.ylabel('y_train')
2. The Saver class
Saver类是TensorFlow库供给的类,它是保存图形结构和变量的***办法。
(1) 保存模型
在以下几行代码中,咱们界说一个Saver目标,并在train_graph()函数中,经过100次迭代的办法最小化本钱函数。然后,在每次迭代中以及优化完结后,将模型保存到磁盘。每个保存在磁盘上创立二进制文件被称为“检查点”。
- #CreateaSaverobject
- saver=tf.train.Saver()
- init=tf.global_variables_initializer()
- #Runasession.Gothrough100iterationstominimizethecost
- deftrain_graph():
- withtf.Session()assess:
- sess.run(init)
- foriinrange(100):
- for(x,y)inzip(x_train,y_train):
- #Feedactualdatatothetrainoperation
- sess.run(trainop,feed_dict={X:x,Y:y})
- #Createacheckpointineveryiteration
- saver.save(sess,'model_iter',global_step=i)
- #Savethefinalmodel
- saver.save(sess,'model_final')
- h_=sess.run(h_est)
- v_=sess.run(v_est)
- returnh_,v_
现在让咱们用上述功用练习模型,并打印出练习的参数。
- result=train_graph()
- print("h_est=%.2f,v_est=%.2f"%result)
- $pythontf_save.py
- h_est=1.01,v_est=-1.96
Okay,参数是十分精确的。假如咱们检查咱们的文件体系,***4次迭代中保存有文件以及终究的模型。
保存模型时,你会注意到需求4种类型的文件才干保存:
- “.meta”文件:包括图形结构。
- “.data”文件:包括变量的值。
- “.index”文件:标识检查点。
- “checkpoint”文件:具有最近检查点列表的协议缓冲区。
图1:检查点文件保存到磁盘
调用tf.train.Saver()办法,如上所示,将避实就虚变量保存到一个文件。经过将它们作为参数,表情经过列表或dict传递来保存变量的子集,例如:tf.train.Saver({‘hor_estimate’: h_est})。
Saver结构函数的一些其他有用的参数,也可以操控整个进程,它们是:
- max_to_keep:最多保存的检查点数。
- keep_checkpoint_every_n_hours:保存检查点的时刻距离。假如你想要了解更多信息,请检查官方文档的Saver类,它供给了其它有用的信息,你可以探究检查。
- Restoring Models
康复TensorFlow模型时要做的***件事便是将图形结构从“.meta”文件加载到当时图形中。
- tf.reset_default_graph()
- imported_meta=tf.train.import_meta_graph("model_final.meta")
也可以运用以下指令探究当时图形tf.get_default_graph()。接着第二步是加载变量的值。提示:值仅存在于会话(session)中。
- withtf.Session()assess:
- imported_meta.restore(sess,tf.train.latest_checkpoint('./'))
- h_est2=sess.run('hor_estimate:0')
- v_est2=sess.run('ver_estimate:0')
- print("h_est:%.2f,v_est:%.2f"%(h_est2,v_est2))
- $pythontf_restore.py
- INFO:tensorflow:Restoringparametersfrom./model_final
- h_est:1.01,v_est:-1.96
如前面所说到的,这种办法只保存图形结构和变量,这意味着经过占位符“X”和“Y”输入的练习数据不会被保存。
无论怎么,在这个比如中,咱们将运用咱们界说的练习数据tf,而且可视化模型拟合。
- plt.scatter(x_train,y_train,label='traindata')
- plt.plot(x_train,(x_train-h_est2)**2+v_est2,color='red',label='model')
- plt.xlabel('x_train')
- plt.ylabel('y_train')
- plt.legend()
Saver这个类答应运用一个简略的办法来保存和康复你的TensorFlow模型(图形和变量)到/从文件,并保存你工作中的多个检查点,这或许是有用的,它可以协助你的模型在练习进程中进行微调。
4. SavedModel格局(Format)
在TensorFlow中保存和康复模型的一种新办法是运用SavedModel,Builder和loader功用。这个办法实际上是Saver供给的更高等级的序列化,它更适合于商业意图。
尽管这种SavedModel办法好像不被开发人员彻底承受,但它的创作者指出:它显然是未来。与Saver首要重视变量的类比较,SavedModel测验将一些有用的功用包括在一个包中,例如Signatures:答应保存具有一组输入和输出的图形,Assets:包括初始化中运用的外部文件。
(1) 运用SavedModel Builder保存模型
接下来咱们测验运用SavedModelBuilder类完结模型的保存。在咱们的示例中,咱们不运用任何符号,但也足以阐明该进程。
0
- y=(x-h)^2+v
1
- y=(x-h)^2+v
运转此代码时,你会注意到咱们的模型已保存到坐落“./SavedModel/saved_model.pb”的文件中。
(2) 运用SavedModel Loader程序康复模型
模型康复运用tf.saved_model.loader,而且可以康复会话规模中保存的变量,符号。
鄙人面的比如中,咱们将加载模型,并打印出咱们的两个系数(h_est和v_est)的数值。数值如预期的那样,咱们的模型现已被成功地康复了。
2
- y=(x-h)^2+v
3
- y=(x-h)^2+v
5. 定论
假如你知道你的深度学习网络的练习或许会花费很长时刻,保存和康复TensorFlow模型是十分有用的功用。该主题太广泛,无法在一篇博客文章中具体介绍。不管怎样,在这篇文章中咱们介绍了两个东西:Saver和SavedModel builder/loader,并创立一个文件结构,运用简略的线性回归来阐明实例。期望这些可以协助到你练习出更好的神经网络模型。