前提:tf.train.import_meta_graph加载meta
saver = tf.train.import_meta_graph(os.path.join(model_fullpath,'model.ckpt-7.meta'))
第一种方法:在上一篇博客中就已经体现了;首先需要找到相关操作的变量名;
首先找到需要的变量的名称;比如我需要的一个网络节点名称为encode_run,需要一个placeholder;但需要在后面添加一个冒号和指定的第几个输出;后面这两个符号可以将节点变成tensor并取得对应的第几个输出;
这样可以正常输出;
如果分别改成1就会输出错误,如下所示:
第二种方法:
使用tf.tf.add_to_collection(),tf.get_collection和 tf.get_default_graph,graph.get_operation_by_name
train 部分:
X_placeholder=tf.placeholder(tf.float32,[None,feature_num],name="X_placeholder")
self.encode_op = tf.identity(self.encode_op, "encode_run")
tf.add_to_collection('encode_nn',self.encode_op)
预测部分:
encode=tf.get_collection('encode_nn')[0]
graph = tf.get_default_graph()
X=graph.get_operation_by_name('X_placeholder').outputs[0]
encoded_data=self.sess.run(encode,feed_dict={X:data})
最后两个方法都正常输出;而且结果一样;
提问:在检验预测结果与训练结果是否相同时,为什么会训练完成后最后两个预测结果与加载模型的预测结果不一样呢?
解答:因为训练完成时预测的结果是使用最后一次训练的参数;而加载的模型参数是训练过程中测试准确率最高的训练参数;所以结果不一样;
验证:将训练过程中的预测改为测试准确率最高时候的输出;如图所示:
输出结果对比:
训练时输出结果:
加载模型时输出结果:
结论:上述两种加载方法都是正确的;可以被使用;