Tensorflow:如何使用恢复的模型?

Posted

技术标签:

【中文标题】Tensorflow:如何使用恢复的模型?【英文标题】:Tensorflow : How to use restored model? 【发布时间】:2018-09-25 02:29:13 【问题描述】:

我正在尝试在 tensorflow 中保存和恢复我的模型,我尝试搜索并找到了许多教程,但没有一个给出明确的说明,即在恢复模型时我应该使用训练期间使用的相同程序还是只恢复型号??

这是 tensorflow 中的简单线性回归模型:

import numpy as np    
import tensorflow as tf

tf.set_random_seed(777)

x_data = [[73., 80., 75.],
          [93., 88., 93.],
          [89., 91., 90.],
          [96., 98., 100.],
          [73., 66., 70.]]
y_data = [[152.],
          [185.],
          [180.],
          [196.],
          [142.]]

class regression_model():
    def __init__(self):

        input_x = tf.placeholder(tf.float32,shape=[None,3])    
        output_y=tf.placeholder(tf.float32,shape=[None,1])    
        self.placeholder='input':input_x,'output':output_y    

        weights= tf.get_variable('weights',shape=[3,1],dtype=tf.float32,initializer=tf.random_uniform_initializer(-0.01,0.01))    
        bias = tf.get_variable('bias',shape=[1],dtype=tf.float32,initializer=tf.random_uniform_initializer(-0.01,0.01))

        result=tf.matmul(input_x,weights) + bias    
        cost=tf.square(result-output_y)    
        loss=tf.reduce_mean(cost)

        train=tf.train.GradientDescentOptimizer(learning_rate=1e-5).minimize(loss)

        self.out ='result':result,'loss':loss,'train':train

def exe_func(model):
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        for step in range(2001):
            out=sess.run(model.out,feed_dict=model.placeholder['input']:x_data,model.placeholder['output']:y_data)
            print("loss", out['loss'], "prediction", out['result'])


if __name__=='__main__':    
    model=regression_model()    
    exe_func(model)

当我运行时,我得到这个输出:

......

loss 0.73689765 prediction [[152.12286]
 [184.14502]
 [180.76541]
 [196.88777]
 [140.74924]]
loss 0.7366613 prediction [[152.12263]
 [184.1452 ]
 [180.76535]
 [196.88771]
 [140.74948]]

Process finished with exit code 0

现在我如何保存这个模型以及如何在新文件中恢复?我尝试了这个 *** question 并做了这样的事情:

def exe_func(model):
    saver = tf.train.Saver()

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        for step in range(2001):
            out=sess.run(model.out,feed_dict=model.placeholder['input']:x_data,model.placeholder['output']:y_data)
            print("loss", out['loss'], "prediction", out['result'])

    saver.save(sess, '/Users/exepaul/Desktop/only_rnn_1/')


if __name__=='__main__':

    model=regression_model()

    exe_func(model)

但我不知道如何使用这个保存的模型以及如何为模型提供输入并获得预测输出?

【问题讨论】:

【参考方案1】:

您提供的“恢复”代码 sn-p 只是重新启动训练过程。一旦你训练了你的神经网络,你就不必继续训练来获得预测。所有模型参数都应该是固定的,并且您只评估给定输入的输出一次。请参见以下示例:

with tf.Session() as sess:
    saver = tf.train.import_meta_graph(savefile)
    saver.restore(sess, tf.train.latest_checkpoint(savedir))

    graph = tf.get_default_graph()
    input_x = graph.get_tensor_by_name("input_x:0")
    result = graph.get_tensor_by_name("result:0")

    feed_dict = input_x: x_data,

    predictions = result.eval(feed_dict=feed_dict)

【讨论】:

【参考方案2】:

@MPA 回答帮助很大,但我必须在@MPA 回答中进行一些修改才能得到结果,我想为其他人提一下:

如果你想保存和恢复图形,首先要在这些操作中指定名称参数值,以便稍后使用,所以我更改

这一行

input_x = tf.placeholder(tf.float32,shape=[None,3]) 

到这里:

input_x = tf.placeholder(tf.float32,shape=[None,3],name='input')

还有这一行

result=tf.matmul(input_x,weights) + bias    

到这里:

result=tf.add(tf.matmul(input_x,weights),bias,name='result')

现在我在新文件中运行这个程序:

import tensorflow as tf


x_data = [[73., 80., 75.]]



with tf.Session() as sess:
    saver = tf.train.import_meta_graph('/Users/exepaul/Desktop/.meta')
    new=saver.restore(sess, tf.train.latest_checkpoint('/Users/exepaul/Desktop/'))

    graph = tf.get_default_graph()
    input_x = graph.get_tensor_by_name("input:0")
    result = graph.get_tensor_by_name("result:0")

    feed_dict = input_x: x_data,

    predictions = result.eval(feed_dict=feed_dict)
    print(predictions)

我得到了输出:

[[152.12238]]

【讨论】:

我能问一些对我来说是一个困惑的根源吗:new = saver.restore()graph = tf.get_default_graph() 之间发生了什么,所以图表包含现在恢复的数据(图表+权重)?恢复命令是否在默认图中导入?我总是对那些你无法通过简单阅读它们来理解的 magical tensorflow 命令感到困惑......@MPA 也

以上是关于Tensorflow:如何使用恢复的模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tensorflow 2.0 w/keras 中保存/恢复大型模型?

如何在 TensorFlow 中恢复多个神经网络模型?

如何在tensorflow中使用保存的模型[重复]

如何在 C++ 中保存和恢复 TensorFlow 图及其状态?

Tensorflow:保存模型并恢复单个权重

如何在 Tensorflow 2 中的模型训练期间捕获任何异常