近期做了一些反垃圾的工作,除了使用常用的规则匹配过滤等手段,也采用了一些机器学习方法进行分类预测,我们使用TensorFlow进行模型的训练,训练好的模型需要保存,预测阶段我们需要将模型进行加载还原使用,这就涉及TensorFlow模型的保存与恢复加载。
总结一下Tensorflow常用的模型保存方式。
<>强保存检查点模型文件(。ckpt) 强>
首先,TensorFlow提供了一个非常方便的api, tf.train.Saver()来保存和还原一个机器学习模型。
<强>模型保存强>
使用tf.train.Saver()来保存模型文件非常方便、下面是一个简单的例子:
进口tensorflow特遣部队 进口操作系统 def save_model_ckpt (ckpt_file_path): x=tf.placeholder (tf.int32 name=' x ') y=tf.placeholder (tf.int32 name=' y ') b=特遣部队。变量(name=" b ") xy=特遣部队。乘(x, y) op=特遣部队。add (xy, b, name=' op_to_store ') 税=tf.Session () sess.run (tf.global_variables_initializer ()) 路径=os.path.dirname (os.path.abspath (ckpt_file_path)) 如果os.path.isdir(路径)是假的: os.makedirs(路径) tf.train.Saver ()。ckpt_file_path保存(税) #测试 feed_dict={x: 2, y: 3} 打印(sess.run (op, feed_dict)) >之前程序生成并保存四个文件(在版0.11本之前只会生成三个文件:检查点,模型。ckpt model.ckpt.meta)
<李>检查点文本文件,记录了模型文件的路径信息列表李> <李> model.ckpt。数据- 00000 - 00001网络权重信息李> <李> model.ckpt。指数. data和.index这两个文件是二进制文件,保存了模型中的变量参数(权)重信息李> <李> model.ckpt。元二进制文件,保存了模型的计算图结构信息(模型的网络结构)protobuf李>
.save以上是tf.train.Saver()()的基本用法,保存()方法还有很多可配置的参数:
tf.train.Saver ()。保存(税、ckpt_file_path global_step=1000)加上global_step参数代表在每1000次迭代后保存模型,会在模型文件后加上“-1000”,model.ckpt - 1000。指数,model.ckpt - 1000。元,model.ckpt。数据- 1000 - 00000 - 00001
每1000次迭代保存一次模型,但是模型的结构信息文件不会变,就只用1000次迭代时保存一下,不用相应的每1000次保存一次,所以当我们不需要保存元文件时,可以加上write_meta_graph=False参数,如下:
代码如下:tf.train.Saver ()。保存(税、ckpt_file_path global_step=1000, write_meta_graph=False)
如果想每两小时保存一次模型,并且只保存最新的4个模型,可以加上使用max_to_keep(默认值为5,如果想每训练一个时代就保存一次,可以将其设置为没有或0,但是没啥用不推荐),keep_checkpoint_every_n_hours参数,如下:
代码如下:tf.train.Saver ()。保存(税、ckpt_file_path max_to_keep=4, keep_checkpoint_every_n_hours=2)
同时在tf.train.Saver()类中,如果我们不指定任何信息,则会保存所有的参数信息,我们也可以指定部分想要保存的内容,例如只保存x, y参数(可传入参数列表或dict):
tf.train。储蓄者((x, y))。保存(税、ckpt_file_path)p。在模型训练过程中需要在保存后拿到的变量或参数名属性名称不能丢,不然模型还原后不能通过get_tensor_by_name()获取。
<强>模型加载还原强>
针对上面的模型保存例子,还原模型的过程如下:
进口tensorflow特遣部队 def restore_model_ckpt (ckpt_file_path): 税=tf.Session () 储蓄者=tf.train.import_meta_graph (。/ckpt/model.ckpt.meta) #加载模型结构 储蓄者。恢复(税,tf.train.latest_checkpoint (’。/ckpt ')) #只需要指定目录就可以恢复所有变量信息 #直接获取保存的变量 print (sess.run (b: 0)) #获取占位符变量 input_x=sess.graph.get_tensor_by_name (x: 0) input_y=sess.graph.get_tensor_by_name (y: 0) #获取需要进行计算的运营商 op=sess.graph.get_tensor_by_name (op_to_store: 0) #加入新的操作 add_on_op=特遣部队。乘(op, 2) ret=sess.run (add_on_op {input_x: 5, input_y: 5}) 打印(ret)浅谈Tensorflow模型的保存与恢复加载