【问题标题】:how to use set_random_seed to get same results如何使用 set_random_seed 获得相同的结果
【发布时间】:2019-08-14 20:19:23
【问题描述】:

我正在尝试了解 LSTM 单元。我已经阅读了几篇文章,现在正在尝试使用 tensorflow 编写自己的代码。

我从这个tutorial 发现了这段代码。于是我复制了lstm.py文件和数据文件sp500.csv。下面的代码是我写的。

一切正常。每次我运行模型时,我都会得到非常不同的预测。我知道因为这个模型非常基础(试图仅使用收盘价来预测股票价格),所以这是可以预料的。我也相信在后台 tensorflow 使用一些随机化过程来启动变量。

我希望每次都运行模型并获得相同的结果。所以我读到要做到这一点,我需要使用 set_random_seed。

我在下面的代码中添加了这个,但是当我重新运行我的代码时,我得到了非常不同的预测。我应该如何使用 set_random_seed,为什么参数是 1234?

from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, LSTM, Dropout, Activation
import lstm, time
import tensorflow as tf

def RunML():

    tf.set_random_seed(1234)

    X_train, y_train, X_test, y_test = lstm.load_data('sp500.csv', 50, True)

    model = Sequential()

    model.add(LSTM(50, 
               input_shape=(50, 1),
               return_sequences=True))
    model.add(Dropout(0.2))

    model.add(LSTM(
        100,
        return_sequences=False))
    model.add(Dropout(0.2))

    model.add(Dense(1))
    model.add(Activation('linear'))

    start = time.time()
    model.compile(loss='mse', optimizer='rmsprop')
    print ('compilation time : ', time.time() - start)

    #Step 3 Train the model
    model.fit(
        X_train,
        y_train,
        batch_size=512,
        nb_epoch=1,
        validation_split=0.05)

    predictions = lstm.predict_sequences_multiple(model, X_test, 50, 50)
    lstm.plot_results_multiple(predictions, y_test, 50)

【问题讨论】:

    标签: python tensorflow machine-learning lstm


    【解决方案1】:

    如果您在构建图表之前设置随机种子,您将获得可重现的结果。例如,给定一个随机输入:

    random_input = np.random.rand(2, 50, 1)
    

    我们可以定义一个tf.keras.model

    tf.keras.backend.clear_session()
    tf.set_random_seed(42)
    
    model_1 = Sequential()
    
    model_1.add(LSTM(50,  input_shape=(50, 1), return_sequences=True))
    model_1.add(Dropout(0.2))
    
    model_1.add(LSTM(100, return_sequences=False))
    model_1.add(Dropout(0.2))
    
    model_1.add(Dense(1))
    model_1.add(Activation('linear'))
    
    model_1.compile(loss='mse', optimizer='rmsprop')
    
    random_predict_1 = model_1.predict(random_input)
    

    然后是另一个:

    tf.keras.backend.clear_session()
    tf.set_random_seed(42)
    
    model_2 = Sequential()
    
    model_2.add(LSTM(50,  input_shape=(50, 1), return_sequences=True))
    model_2.add(Dropout(0.2))
    
    model_2.add(LSTM(100, return_sequences=False))
    model_2.add(Dropout(0.2))
    
    model_2.add(Dense(1))
    model_2.add(Activation('linear'))
    
    model_2.compile(loss='mse', optimizer='rmsprop')
    
    random_predict_2 = model_2.predict(random_input)
    

    现在,如果我们对 random_input 张量进行推理,我们将使用两个模型得到相同的结果,因为它们具有相同的随机种子开始。

    np.testing.assert_array_equal(random_predict_1, random_predict_2)
    

    综上所述,无论你使用哪个随机种子,如果你在用tf.set_random_seed(seed)建图之前将随机种子设置为相同的数字,你会得到相同的结果。

    【讨论】:

    • 感谢您的回答。我将这两行代码添加到 tf.keras.backend.clear_session() tf.set_random_seed(42) 下的 def RunML(): 但是在运行模型时我仍然得到不同的结果。我认为我错过了什么?
    • 通过我所做的,您将确定模型权重将在开始时使用相同的值进行初始化(正如我在代码中演示的那样)。如果您想要精确到小数点后第 N 位的结果(我现在不知道为什么会这样),请关注 this post
    • 好的,谢谢,我会通过帖子。我不追求相同的结果,直到小数点后第 N 位,它只是来自模型的预测有时是正面的,然后下一次是负面的......这就是我想要解决的问题。在您的示例中缺少培训部分吗?
    • 是的。通常,实现(几乎)相同结果的常用方法是在开始时设置随机种子,以便所有模型权重和 tf/keras 操作都从该种子开始。因此,我省略了我正在训练模型的部分。我只是设置随机种子并随机初始化模型权重。因为它是受控随机性(由于相同的随机种子),所以结果是相同的。
    猜你喜欢
    • 2018-10-24
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多