我正在尝试了解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)
答案 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)
构建图形之前将随机种子设置为相同的数字,您将获得相同的结果。