如何使用set_random_seed获得相同的结果

时间:2019-08-14 20:19:23

标签: python tensorflow machine-learning lstm

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

我从此tutorial中看到了这段代码。因此,我复制了lstm.py文件和数据文件sp500.csv。下面的代码是我写的。

一切正常。每次我运行模型时,我都会得到非常不同的预测。我知道,因为此模型非常基础(试图仅使用收盘价来预测股票价格),所以这是可以预期的。我也相信背景张量流使用某种随机化过程来初始化变量。

我想运行模型并每次都获得相同的结果。所以我读到做到这一点,我需要使用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)

1 个答案:

答案 0 :(得分: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)构建图形之前将随机种子设置为相同的数字,您将获得相同的结果。