首页 > 解决方案 > 使用相同的参数一遍又一遍地构建神经网络会产生不同的结果

问题描述

我正在使用张量流 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")

标签: tensorflowkerasdeep-learning

解决方案


没有看到你的代码,我只能推断是因为神经网络的权重是随机初始化的;当你提到

“配置都一样”

您可以参考您从一开始就实际设置它们的超参数,或者迭代一组以确定针对您的特定问题的最合适的值。

但是,它们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 之间的结果可能永远无法实现完美的重现性。


推荐阅读