TensorFlow中使用已保存模型进行预测的技术咨询
作为TensorFlow新手,刚把模型恢复好就卡壳不知道怎么预测太正常了,我来一步步帮你搞定:
第一步:先找到计算图里的输入和输出节点
你用tf.train.import_meta_graph把整个训练时的计算图加载进来了,但现在不知道哪个是给模型喂数据的输入口、哪个是输出预测结果的节点。先把所有节点名称打印出来找找看:
graph = tf.get_default_graph() # 遍历打印所有节点的名字,方便定位输入输出 for op in graph.get_operations(): print(op.name)
你训练的时候肯定定义过输入(比如当时命名为x_input、input_data)和输出(比如predictions、logits),从打印的列表里找这些眼熟的名字就行。要是记不清训练时的命名,回忆下当时写的代码,比如有没有写过x = tf.placeholder(..., name='xxx'),这个name参数就是节点的标识。
第二步:获取输入和输出对应的张量
找到节点名后,用graph.get_tensor_by_name()获取对应的张量,一定要加上:0后缀(TensorFlow里每个节点的第一个输出张量默认是:0):
# 举个例子,假设你的输入节点叫x_input,输出节点叫predictions input_tensor = graph.get_tensor_by_name('x_input:0') output_tensor = graph.get_tensor_by_name('predictions:0')
第三步:执行预测计算
现在输入输出的张量都拿到了,直接用会话sess跑预测就行:
# 这里假设你已经把x_predict处理成符合模型输入要求的格式(形状、数据类型都要和训练时一致) predict_results = sess.run(output_tensor, feed_dict={input_tensor: x_predict})
⚠️ 这里要注意:x_predict的形状和数据类型必须和你训练时喂给模型的输入完全匹配,比如训练时输入是[batch_size, 128](128个特征),那x_predict就得是[待预测样本数, 128]的形状,数据类型也要对应(比如都是float32)。
额外小科普:模型保存的内容
你用saver.save()保存模型时,会自动把训练过程中所有训练好的变量(比如权重W、偏置b这些参数)都存在ckpt文件里,恢复后这些参数的值就和训练结束时一模一样,不用你手动去加载,只要找对输入输出节点就能直接用。
要是怕下次恢复再找不到节点,建议你训练模型的时候,给输入和输出张量显式指定name参数,比如:
# 训练时的代码示例,给输入输出明确命名 x = tf.placeholder(tf.float32, shape=[None, 784], name='model_input') y_pred = tf.nn.softmax(logits, name='model_predictions')
这样下次恢复时,直接用model_input:0和model_predictions:0就能精准定位到对应的张量了。
内容的提问来源于stack exchange,提问作者Vectoria

