2018-06-26《TensorFlow模型保存、提取、预测》更新版

任务一:用保存好的模型做预测

由于经常要使用tensorflow进行网络训练,但是在用的时候每次都要把模型重新跑一遍,这样就比较麻烦;另外由于某些原因程序意外中断,也会导致训练结果拿不到,而保存中间训练过程的模型可以以便下次训练时继续使用。所以学会tensorflow的save model和load model非常有用。

英文学习手册:A quick complete tutorial to save and restore Tensorflow models

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第1张图片
手册内容

1.什么是Tensorflow模型?

当你训练完一个神经网络后,你可能想保存它,方便将来用上,直接用的产品上,不用再经过漫长的训练。Tensorflow模型主要包含两个内容:1)我们设计的网络图  2)我们训练过程中得到的网络图中的变量(variable)参数值。 因此,Tensorflow主要由两个文件来描述:

a)Meta graph:这个文件主要保存整个Tensorflow图模型,包含所有的变量(variables)、操作(operations)、集合(collections)等。这个文件的扩展为.meta

b)Checkpoint file:这个二进制文件包含所有的权重值、偏量值、梯度下降值以及其他变量值。这个文件的扩展为.ckpt。

2.如何保存Tensorflow模型

语句1:saver=tf.train.Saver()

在Tensorflow中,如果你想保存图模型和所有的参数值,那么首先,我们应该使用tf.train.Saver()创建一个模型保存类的实例。

语句2:saver.save(sess,'my_model')

注意:Tensorflow变量值只存在于会话执行中,因此保存模型的语句saver.save(sess,'my_model')应该在with tf.Session() as see:语句之后。

模型保存简单代码:

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第2张图片
模型保存简单代码
2018-06-26《TensorFlow模型保存、提取、预测》更新版_第3张图片
模型保存后,生成的文件

注意:如果tf.train.Saver()实例化,没有传入具体的参数时,它就会保存模型中所有的变量。如果,我们只想保存自己想要的一些变量,我们就可以把自己想要保存的变量名,以list的形式放入tf.train.Save()中。如下:

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第4张图片
只保存自己想要的变量

3.加载模型

模型的加载需要2步:

a)建立图模型

语句1:saver=tf.train.import_meta_graph('my_model.meta')

我们已经在保存的时候,将模型的图保存在.meta文件中了。因此使用语句:saver=tf.train.import_meta_graph('my_model.meta')。注意:此处虽然重新加载了图模型,但还没有将图中参数的实际数据放入。

b)加载参数

语句2:saver.restore(sess,tf.train.latest_checkpoint('你的模型路径名')

使用saver(它是tf.train.Saver()类实例化的对象)调用restore()方法,就能够加载模型参数。

模型加载简单代码:

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第5张图片
模型加载简单代码

4.使用存储好的模型进行工作

前面已经学会了模型保存save和模型加载restore。此处要学习利用提前训练好的模型的参数,去预测、调试、或进一步训练。

无论什么时候使用Tensorflow,自己定义的模型图,都需要放入训练数据集和一些参数。标准的方式是,将训练集和参数使用placeholder占位符进行填充。注意:当模型保存的时候,其实使用placeholder占位符填充的的数据是没有保存的

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第6张图片
注意:保存模型时,placeholder占位符的数据是没有保存的

A.原始模型,新数据

利用原始的网络结构,不同的数据集,我们只需将新的数据集通过feed_dict传入原始模型中就行。具体步骤如下:

1)创建会话tf.Session() 

2)加载模型 (加载图和加载参数)

3)使用graph=tf.get_default_graph()语句说明使用原始模型

4)获取原始模型中的placeholder和自己想要的ops,然后通过feed_dict字典,对占位符填充新的数据集。

5)使用sess.run()运行自己想要op和输入新数据集

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第7张图片
【旧模型,新数据集】的一个简单代码

B.原始模型变新模型,新数据集

如果想要在原始训练好的模型的基础上添加更多的操作,然后再训练这个新模型,同样也是可以做到的。具体步骤如下:

1)创建会话tf.Session() 

2)加载模型 (加载图和加载参数)

3)使用graph=tf.get_default_graph()语句说明使用原始模型

4)获取原始模型中的placeholder,然后通过feed_dict字典,对占位符填充新的数据集。

5)获取原始模型中你想要的ops,然后添加新的ops,就构成了新模型。

6)使用sess.run()运行自己想要op和输入新数据集

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第8张图片
【旧模型变新模型,新数据集】的一个简单代码


模型预测:


2018-06-26《TensorFlow模型保存、提取、预测》更新版_第9张图片
1
2018-06-26《TensorFlow模型保存、提取、预测》更新版_第10张图片
2
2018-06-26《TensorFlow模型保存、提取、预测》更新版_第11张图片
3

出现问题:KeyError: "The name 'encoder_inputs:0' refers to a Tensor which does not exist. The operation, 'encoder_inputs', does not exist in the graph."      错误提示:我保存的模型中,占位符encoder_inputs没有存在我当前保存的图中。



出现该问题的原因:这个placeholder,被放在了自定义命名空间Input下了,所以在获取这个变量名时,路径就没有写对。

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第12张图片
出错原因,该tensor在命名空间下,所以自己的获取路径不对

问题解决办法:修改graph.get_tensor_by_name('tensor正确的路径名')。

解决办法

问题解决完毕!!!!



出现问题:KeyError: "The name 'decode:0' refers to a Tensor which does not exist. The operation, 'decode', does not exist in the graph."  错误提示:我想获取的decode其实不是一个简单的op,并不存在于保存的图模型中。

其实decode在程序中是一个自定义函数。可以使用tf.identity给op命名。具体改动:

tf.identity()将out.sample_id这个op命名为yaojuan

使用tf.identity()重新命名tensor名后,就能够很好的使用graph.get_tensor_by_name()获取op。

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第13张图片
解决方法

问题解决完毕!!!




最终改动后的预测模型:

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第14张图片
1
2018-06-26《TensorFlow模型保存、提取、预测》更新版_第15张图片
2
2018-06-26《TensorFlow模型保存、提取、预测》更新版_第16张图片
3

存在的问题:使用加载的模型,保证不了精确率!!!不知道是不是权值没有load上,或者是在预测过程中,参数权值自己又随意变动了?



参考文章:

【1】【tensorflow】保存模型、再次加载模型等操作

【2】seq2seq.py    

【3】Tensorflow动态seq2seq使用总结

【4】tensorflow将训练好的模型freeze,即将权重固化到图里面,并使用该模型进行预测

任务二:周杰伦粉丝团数据主题

1.下载安装Robo 3T   用于连接mongodb

2.数据存放在ai_crawler中

2018-06-26《TensorFlow模型保存、提取、预测》更新版_第17张图片
数据位置

3.使用python读取数据,并分析:还没开始。


任务三:情感分析代码

该代码已经拷到自己电脑上了。

你可能感兴趣的:(2018-06-26《TensorFlow模型保存、提取、预测》更新版)