tensorflow - 使用相同的参数一遍又一遍地构建神经网络会产生不同的结果
问题描述
我正在使用张量流 2.3.0
我正在创建 RNN 来预测股票价格,每当我重新启动 jupyter notebook 并重新运行我的所有代码时,它都会输出非常不同的预测。当所有超参数完全相同时,为什么会这样?
我知道这是一个非常基本的问题,但有人可以告诉我或告诉我在哪里可以读到它吗?
这是我的代码:
def GetStockData(ticker_name, period, start_date, end_date):
tickerData = yf.Ticker(ticker_name)
df = tickerData.history(period=period, start=start_date, end=end_date)
return df
full_nvda_df = GetStockData("NVDA", "1d", "2016-01-01", "2020-10-10")
nvda_df = full_nvda_df[["Close"]].copy()
train_df = nvda_df[:1000]
test_df = nvda_df[1000:]
train_arr = np.array(train_df)
test_arr = np.array(test_df)
for i in range(30, len(train_df)):
X_train.append(train_arr[i-30:i])
y_train.append(train_arr[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)
np.random.seed(1337)
model = tf.keras.Sequential([
tf.keras.layers.LSTM(units=60, activation='relu', return_sequences=True, input_shape=(X_train.shape[1], 1) ),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.LSTM(units=60, activation='relu', return_sequences=True),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.LSTM(units=80, activation='relu', return_sequences=True),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.LSTM(units=120, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(units=1)
])
model.summary()
model.compile(loss = "mean_squared_error",
optimizer = "adam")
解决方案
没有看到你的代码,我只能推断是因为神经网络的权重是随机初始化的;当你提到
“配置都一样”
您可以参考您从一开始就实际设置它们的超参数,或者迭代一组以确定针对您的特定问题的最合适的值。
但是,它们weights
是随机初始化的,这将不可避免地导致网络的收敛路径不同,因此显然会出现不同的局部最优值(即不同的结果)。
确保可重复性(据我所知)的唯一方法是“播种一切”,如下所示:
random.seed(seed)
np.random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
tf.random.set_seed(seed)
根据 GitHub 上的这个线程https://github.com/keras-team/keras/issues/14986,
在 TensorFlow >=2.5
中,可以使用TF_DETERMINISTIC_OPS=1
也是一种确保重现性的解决方案。
然而,它提到仍然有一些 GPU Ops 不可重现,并且 CPU 和 GPU 之间的结果可能永远无法实现完美的重现性。
推荐阅读
- spring - 如何为配置中尚不存在的任何 spring 配置文件指定默认 Logback 配置
- r - Should I use mget(), .. or with=FALSE to select columns of a data.table?
- math - 如何解决这种重复:T(n) = 2T(n/3)+n^2?
- python - 如何从 python 进程调用 python 脚本
- jquery - Can I hide only the Bootstrap Modal's content?
- android - 多个连续的权限请求不起作用
- flutter - 如何移动下拉箭头左侧而不是默认情况下颤动的右侧?
- c# - 即使传递了值,标签也不会更新
- php - 如何使 Laravel 会话数组推送?
- php - 基于 PDO 的查询,标准字符串中有空格在 PHP 中不起作用