任务一:用保存好的模型做预测
由于经常要使用tensorflow进行网络训练,但是在用的时候每次都要把模型重新跑一遍,这样就比较麻烦;另外由于某些原因程序意外中断,也会导致训练结果拿不到,而保存中间训练过程的模型可以以便下次训练时继续使用。所以学会tensorflow的save model和load model非常有用。
英文学习手册:A quick complete tutorial to save and restore Tensorflow models
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:语句之后。
模型保存简单代码:
注意:如果tf.train.Saver()实例化,没有传入具体的参数时,它就会保存模型中所有的变量。如果,我们只想保存自己想要的一些变量,我们就可以把自己想要保存的变量名,以list的形式放入tf.train.Save()中。如下:
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()方法,就能够加载模型参数。
模型加载简单代码:
4.使用存储好的模型进行工作
前面已经学会了模型保存save和模型加载restore。此处要学习利用提前训练好的模型的参数,去预测、调试、或进一步训练。
无论什么时候使用Tensorflow,自己定义的模型图,都需要放入训练数据集和一些参数。标准的方式是,将训练集和参数使用placeholder占位符进行填充。注意:当模型保存的时候,其实使用placeholder占位符填充的的数据是没有保存的。
A.原始模型,新数据
利用原始的网络结构,不同的数据集,我们只需将新的数据集通过feed_dict传入原始模型中就行。具体步骤如下:
1)创建会话tf.Session()
2)加载模型 (加载图和加载参数)
3)使用graph=tf.get_default_graph()语句说明使用原始模型
4)获取原始模型中的placeholder和自己想要的ops,然后通过feed_dict字典,对占位符填充新的数据集。
5)使用sess.run()运行自己想要op和输入新数据集
B.原始模型变新模型,新数据集
如果想要在原始训练好的模型的基础上添加更多的操作,然后再训练这个新模型,同样也是可以做到的。具体步骤如下:
1)创建会话tf.Session()
2)加载模型 (加载图和加载参数)
3)使用graph=tf.get_default_graph()语句说明使用原始模型
4)获取原始模型中的placeholder,然后通过feed_dict字典,对占位符填充新的数据集。
5)获取原始模型中你想要的ops,然后添加新的ops,就构成了新模型。
6)使用sess.run()运行自己想要op和输入新数据集
模型预测:
出现问题: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下了,所以在获取这个变量名时,路径就没有写对。
问题解决办法:修改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()重新命名tensor名后,就能够很好的使用graph.get_tensor_by_name()获取op。
问题解决完毕!!!
最终改动后的预测模型:
存在的问题:使用加载的模型,保证不了精确率!!!不知道是不是权值没有load上,或者是在预测过程中,参数权值自己又随意变动了?
参考文章:
【1】【tensorflow】保存模型、再次加载模型等操作
【2】seq2seq.py
【3】Tensorflow动态seq2seq使用总结
【4】tensorflow将训练好的模型freeze,即将权重固化到图里面,并使用该模型进行预测
任务二:周杰伦粉丝团数据主题
1.下载安装Robo 3T 用于连接mongodb
2.数据存放在ai_crawler中
3.使用python读取数据,并分析:还没开始。
任务三:情感分析代码
该代码已经拷到自己电脑上了。