如果深度神经网络模型的复杂度很高,那么训练它可能需要相当长的时间,当然也取决于你的数据量,运行的硬件型号等等等。在大多数情况下,您需要通过保存文件来保持实验的稳定性,以防万一它被中断(或错误),您可以从开始的地方继续而不会出错。更重要的是,对于任何深度学习框架,比如TensorFlow,在训练成功后,都需要复用模型学习到的参数来完成对新数据的预测。在这篇文章中,我们将了解如何保存和恢复TensorFlow模型,其中我们描述了一些最有用的方法并提供了一些示例。1.首先我们快速介绍一下TensorFlow模型。TensorFlow的主要功能是传递张量。它的基本数据结构类似于NumPy中的多维数组,而图形则代表数据计算。它是一个符号库,这意味着定义图和张量只会创建一个模型,而获取具体值和对张量的操作将在一个会话中进行,这是一种在图中进行建模操作的会话机制。当会话关闭时,张量的任何具体值都会丢失,这是在运行会话后将模型保存到文件的另一个原因。通过示例更容易理解,所以让我们创建一个简单的TensorFlow模型,用于对2D数据进行线性回归。首先,我们将导入我们的库:importtensorflowastfiimportnumpyasnpiimportmatplotlib.pyplotasplt%matplotlibinline下一步是创建模型。我们将生成一个模型,该模型将估计以下形式的二次函数的水平和垂直位移:y=(x-h)^2+v其中h是水平变化,v是垂直变化。以下是模型的生成方式(详情请参见代码中的注释):(0.0,name='hor_estimate')v_est=tf.Variable(0.0,name='ver_estimate')#y_estholdstheestimatedvaluesony-axisy_est=tf.square(X-h_est)+v_est#Defineacostfunctionastheensquareddisty=ow((Y-y_est,2))#Thetrainingoperationforminimizingthecostfunction.The#learningrateis0.001trainop=tf.train.GradientDescentOptimizer(0.001).minimize(cost)在创建模型的过程中,我们需要有一个模型在session中运行,并传递一些真实的数据。我们生成一些二次数据并向它们添加噪声。#Usesomevaluesforthehorizo??ntalandverticalshift=1v=-2#Generatetrainingdatawithnoisex_train=np.linspace(-2,4,201)noise=np.random.randn(*x_train.shape)*0.4y_train=(x_train-h)**2+v+noise#可视化数据plt.rcParams['figure.figsize']=(10,6)plt.scatter(x_train,y_train)plt.xlabel('x_train')plt.ylabel('y_train')2.Saver类Saver类由TensorFlow库类,这是保存图形结构和变量的唯一方法。(1)保存模型在下面几行代码中,我们定义了一个Saver对象,在train_graph()函数中,最小化100次迭代后的代价函数。然后,在每次迭代和优化完成后,将模型保存到磁盘。在磁盘上创建的每个保存的二进制文件称为“检查点”。#CreateaSaverobjectsaver=tf.train.Saver()init=tf.global_variables_initializer()#Runasession.Gothrough100iterationstominimizethecostdeftrain_graph():withtf.Session()assess:sess.run(init)foriinrange(100):for(x,y)inzip(x_train,y_train):#Feedactualdatatothetrainoperationsess.run(trainop,feed_dict={X:x,Y:y})#Createacheckpointineveryiterationsaver.save(sess,'model_iter',global_step=i)#Savethefinalmodelsaver.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.pyh_est=1.01,v_est=-1.96不错,参数很准确。如果我们检查我们的文件系统,就会发现在最后4次迭代中保存了文件以及最终模型。保存模型时,您会注意到需要保存4种类型的文件:“.meta”文件:包含图形结构。“.data”文件:包含变量的值。“.index”文件:标识检查点。“检查点”文件:带有最近检查点列表的协议缓冲区。图1:检查点文件保存到磁盘调用tf.train.Saver()方法,如上所示,将所有变量保存到文件中。通过将变量子集作为参数、表达式通过列表或字典传递来保存变量子集,例如:tf.train.Saver({'hor_estimate':h_est})。Saver构造函数的其他一些有用参数,也可以控制整个过程,包括:max_to_keep:要保留的检查点的最大数量。keep_checkpoint_every_n_hours:保持检查点的时间间隔。如果您想了解更多信息,请查看Saver类的官方文档,其中提供了您可以探索的其他有用信息。恢复模型在恢复TensorFlow模型时做的第一件事是将图结构从“.meta”文件加载到当前图中。tf.reset_default_graph()imported_meta=tf.train.import_meta_graph("model_final.meta")也可以使用tf.get_default_graph()探索当前图。那么第二步就是加载变量的值。提醒:值只存在于会话中。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.pyINFO:tensorflow:Restoringparametersfrom./model_finalh_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)使用SavedModelBuilder保存模型接下来,我们尝试使用SavedModelBuilder类来保存模型。在我们的示例中,我们不使用任何符号,但这足以说明该过程。tf.reset_default_graph()#重新初始化我们的twovariablesh_est=tf.Variable(h_est2,name='hor_estimate2')v_est=tf.Variable(v_est2,name='ver_estimate2')#Createabuilderbuilder=tf.saved_model.builder.SavedModelBuilder('./SavedModel/')#Addgraphandvariablestobuilderandsavewithtf.Session()assess:sess.run(h_est.initializer)sess.run(v_est.initializer)builder.add_meta_graph_and_variables(sess,[tf.saved_model.tag_constants.TRAINING],signature_def_map=None,assets_无)builder.save()$pythontf_saved_model_builder.pyINFO:tensorflow:Noassetstosave.INFO:tensorflow:Noassetstowrite.INFO:tensorflow:SavedModelwrittento:b'./SavedModel/saved_model.pb'当你运行这段代码时,你会注意到我们的模型保存到位于“./SavedModel/saved_model.pb”的文件。(2)使用SavedModelLoader程序恢复模型模型恢复使用tf.saved_model.loader,可以恢复session作用域中保存的变量和符号。在下面的示例中,我们将加载模型并打印出我们的两个系数(h_est和v_est)的值。值符合预期,我们的模型已成功恢复。用tf.Session()评估:tf.saved_model.loader.load(sess,[tf.saved_model.tag_constants.TRAINING],'./SavedModel/')h_est=sess.run('hor_estimate2:0')v_est=sess。run('ver_estimate2:0')print("h_est:%.2f,v_est:%.2f"%(h_est,v_est))$pythontf_saved_model_loader.pyINFO:tensorflow:Restoringparametersfromb'./SavedModel/variables/variables'h_est:1.01,v_est:-1.965。结论如果您知道深度学习网络的训练可能需要很长时间,那么保存和恢复TensorFlow模型是一项非常有用的功能。该主题过于宽泛,无法在一篇博文中详细介绍。总之,在这篇文章中,我们介绍了两个工具:Saver和SavedModel构建器/加载器,并创建了一个文件结构来说明使用简单线性回归的示例。希望这些可以帮助你训练出更好的神经网络模型。
