没有再培训的张量流量计算

时间:2017-09-29 07:35:06

标签: python tensorflow

我想在tensorflow中训练一次模型,然后想要使用训练过的模型来预测某些函数。在我们进入细节之前,让我们定义一些函数......

def runTF(func, inpDict):
    sess = tf.Session()
    init = tf.global_variables_initializer()
    sess.run(init)
    result = sess.run(func, feed_dict = inpDict)
    sess.close()
    return result

def optTF(opt, res, others, inpDict, nSteps, printSteps=50):

    os, re = [], []

    sess = tf.Session()
    init = tf.global_variables_initializer()
    sess.run(init)

    for i in range(nSteps):

        # First run the optimizer ...
        sess.run(opt, feed_dict = inpDict)

        # Save all the data you want to save
        temp = sess.run( [res] + others, feed_dict = inpDict) 
        re.append(temp[0])
        os.append(temp[1:])

        if (i%printSteps) == 0:
            print('{:5d}'.format(i))

    sess.close()

    return re, os

以下是我正在做的几个步骤......

一个。生成一些数据

N        = 500
features = 2
nSteps   = 1000

X = np.array([np.random.random(N), np.random.random(N)])
data = [X.T, X[0].reshape(-1, 1)]

B中。创建一个简单的线性模型

d    = tf.placeholder(shape = np.shape(data[0]), dtype = tf.float32, name='d') # input layer
dOut = tf.placeholder(shape = np.shape(data[1]), dtype = tf.float32, name='dOut') # output layer

W = tf.Variable(  np.random.randn(features, 1), dtype = tf.float32, name='W')
b = tf.Variable(               np.zeros((1,1)), dtype = tf.float32, name='b')

result = tf.matmul(d, W)+b
cost = tf.reduce_mean((dOut - result)**2)

optimizer = tf.train.AdamOptimizer(learning_rate = 0.1).minimize(cost)

℃。让我们运行优化器

inpDict = {d: data[0], dOut:data[1]}
ot = optTF(optimizer, result, [W, cost], inpDict, 200, 50)

在这里,我检查了结果,看到它就是我想要的。所以优化器工作正常。该模型已经过优化。现在,我想用其他一些数据进行预测。所以我做...

r = runTF(result, inpDict)

这个新结果不是我对同一训练模型的期望。

现在,只要我保持在同一个tf.Session()内,我们就可以了。但是,即使我完成了会话,我也希望能够做出预测。所以我的问题是,一旦我们在一个不同的会话中训练了一个模型,我该如何使用模型?

请注意,整个事情是我在不同的会话中所做的事情?

编辑:

我编辑了两个功能以合并保存...

def runTF(func, inpDict, modelFile=None):

    if modelFile is not None:
        saver = tf.train.Saver()

    sess = tf.Session()

    init = tf.global_variables_initializer()
    sess.run(init)

    if modelFile is not None:
        ckpt = tf.train.get_checkpoint_state(modelFile)
        print(modelFile, ckpt)
        if ckpt and ckpt.model_checkpoint_path:
            saver.restore(sess, ckpt.model_checkpoint_path)
            print('Session restored')

    result = sess.run(func, feed_dict = inpDict)
    sess.close()
    return result

def optTF(opt, res, others, inpDict, nSteps, printSteps=50, modelFile='models/temp.ckpt'):

    os, re = [], []
    saver = tf.train.Saver()

    sess = tf.Session()
    init = tf.global_variables_initializer()
    sess.run(init)

    for i in range(nSteps):

        # First run the optimizer ...
        sess.run(opt, feed_dict = inpDict)

        # Save all the data you want to save
        temp = sess.run( [res] + others, feed_dict = inpDict) 
        re.append(temp[0])
        os.append(temp[1:])

        if (i%printSteps) == 0:
            print('{:5d}'.format(i))

    path = saver.save(sess, modelFile)
    print('Model saved in: {}'.format(path))
    sess.close()

    return re, os

将模型运行为:

ot = optTF(optimizer, result, [cost]+weights+biases, inpDict, 200, 50)
r = runTF([result], inpDict, 'models/temp.ckpt')

仍然没有!我查了一下:

  • ckpt的值为None
  • models文件夹包含以下文件:
    • checkpoint
    • temp.ckpt.index
    • temp.ckpt.data-00000-of-00001
    • temp.ckpt.meta

1 个答案:

答案 0 :(得分:0)

您需要保存并恢复正在创建和培训的会话。如在

init = tf.initialize_all_variables()
saver = tf.train.Saver()
with tf.Session() as sess:
    sess.run(init)
    if restore:
        ckpt = tf.train.get_checkpoint_state(save_path)
        if ckpt and ckpt.model_checkpoint_path:
            saver.restore(sess, ckpt.model_checkpoint_path)
    else:
        # ... training code omitted ...
        saver.save(sess, save_path)
如果您想使用estimator而不是仅仅一个会话创建完整模型,

结帐https://www.tensorflow.org/programmers_guide/saved_model