重新使用Tensorflow会话而不制作检查点

时间:2018-04-15 13:51:13

标签: python tensorflow machine-learning

我正在尝试创建一个使用时间序列(UNIX纪元时间)和值生成预测的脚本。为了美学目的,我正在为脚本的每个部分创建不同的方法。这是一个例子:

def train_model(X_data, y_data):
   # Creating placeholders X and y

   # Creating optimizer and init variables

   with tf.Session() as sess:
       init.run()
       for epoch in range(200):
           for (xh, yh) in zip(X_data, y_data):
               sess.run(optimizer, feed_dict={X: xh, y: yh})

       # Is it possible to return the trained model in a variable?

def make_pred(model, date):
    # Use the previous model to generate a prediction?
    with tf.Session() as sess:
       return sess.run(model, feed_dict={X: date})

如何使用在函数generate_model中创建的模型而不将其保存在检查点文件中?

奖金问题:

  • 当学习率为0.001时,模型无法生成预测,我必须使用接近1e-20的值才能在我的日志中看到NaN以外的其他内容。这是因为我没有缩放时间序列数组吗?什么是扩展它们的最佳方法?
  • 由于我没有很多训练数据,我应该使用整套训练吗?当我的值小于100时,交叉验证集如何工作?我对预测更感兴趣,而不是对结果进行可视化。

我对此很陌生,如果你看到任何不合适的条款,请不要犹豫,纠正我。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

问题

如何使用在generate_model函数中创建的模型而不将其保存在检查点文件中?

答案

将您的功能更改为一个类,并在类中保持会话活动

class MyModel:
    def __init__(self):
        self.sess = tf.Session()
        init.run()

    def train_model(self, X_data, y_data):
        # Creating placeholders X and y
        for epoch in range(200):
           for (xh, yh) in zip(X_data, y_data):
               sess.run(optimizer, feed_dict={X: xh, y: yh})

    def make_pred(self, date):
        # Use the previous model to generate a prediction yp
        return sess.run(yp, feed_dict={X: date})

使用model = MyModel()创建您的课程的实例,然后像model.train_model(X_data,y_data)一样训练它,并像model.make_pred(date)一样使用它。

奖金问题1

当学习率为0.001时,模型无法生成预测,并且我必须使用接近1e-20的值才能在我的日志中看到除NaN之外的其他内容。这是因为我没有缩放时间序列数组吗?什么是扩展它们的最佳方法?

奖金回答1

选择合适的学习率是调整超级参数的一个重要方面,并且在学习率过高的情况下获得NaN(或其他不适当的值)的情况并不少见。

如果您可以缩放时间序列以进行标准化,那肯定会有所帮助。尝试将系列缩放到介于0.0和1.0或-1.0和1.0之间,无论什么都是最有意义的。

扩展它们的最佳方法取决于数据。如果您的时间序列在室外温度(例如)之间并且在-20C和+ 20C之间,那么可能只是T / 20(除以20)来标准化它会很棒。如果你的时间序列是恒星气体的宇宙温度,范围在-270C到50,000C之间,那么log(T)可能更好地得到温度的大小

奖金问题2

由于我没有很多训练数据,我应该使用整套训练吗?当我的值小于100时,交叉验证集如何工作?

奖金回答2

假设您有100个列车数据点。您可以制作一个预测器,使用前20个数据点进行测试,其余的用于训练。然后,您可以制作另一个预测器,使用第二个20个数据点进行测试,另外80个用于训练,依此类推,以便您有5个经过单独训练和测试的预测变量。这将是 5折交叉测试。您知道每个预测变量的报告测试结果,并且您有5个预测变量(如果使用N个折叠,则为N)。

当您使用预测变量时,您将通过每个预测变量运行新数据并进行5次估算。现在,您可以从您的迷你专家系列中获得可能的答案范围。您可以报告答案的平均值,RMS,高和低。所有重要信息。