考慮到以下代碼:
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layer import Dense
from tensorflow.keras.optimizers import Adam
def build_model()。
model = Sequential()
model.add(Dense(units=64, kernel_initializer='uniform'/span>, activation='relu'/span>)
model.add(Dense(units=128, kernel_initializer='uniform'/span>, activation='relu')
model.add(Dense(units=64, kernel_initializer='uniform'/span>, activation='relu')
model.add(Dense(units=1, kernel_initializer='uniform'/span>, activation='relu'/span>)
optimizer = Adam(learning_rate=0.001)
model.compile(loss='mean_squared_error', optimizer=optimizer)
return model
model1 = build_model()
model1.fit(X_train, Y_train, epochs=10, batch_size=64, verbose=0) # Initial fitting.
keras.models.save_model(model1, f "models/initial") # 在進一步擬合之前保存模型。
model1.fit(X_train, Y_train, epochs=15, batch_size=64, verbose=0)
predictions1 = model1.predict(X_test)
model2 = keras.models.load_model(f "models/initial") # Loading the model after the initial fitting.
model2.fit(X_train, Y_train, epochs=15, batch_size=64, verbose=0)
predictions2 = model2.predict(X_test)
print("--------------------------------")
print(predictions1)
print("--------------------------------")
print(predictions2)
print("--------------------------------")
我建立了一個模型,我最初進行了擬合。然后我保存該模型。之后,該模型被進一步擬合了15個epochs并進行了預測。最終的模型沒有被保存。 之后,保存的模型(前10個歷時后的擬合)被加載,并執行與上述相同的程序(進一步擬合和預測)。 兩次預測的結果應該是一樣的,因為應該使用同一個模型,但是,它們不是。有什么想法,可能是這個原因嗎? 以下是我得到的結果:
--------------------------------
[[2350.2917]
[2369.7139]
[2367.1833]
[2373.8337]
[2369.4788]
[2373.716 ]
[2372.0095]
[2374.5989]
[2374.658 ]]
--------------------------------
[[2532.1902]
[2571.7231]
[2566.572 ]
[2580.1086]
[2571.2444]
[2579.8694]
[2576.395 ]
[2581.6663]
[2581.786 ]]
--------------------------------
行程結束與退出代碼0。
uj5u.com熱心網友回復:
你的理由是正確的,然而我認為(其中一個原因)這里的不同結果是由于訓練的隨機方式造成的。
假設我們都有相同的網路,我們以相同的方式初始化它,我們使用 Xavier 初始化。
那么,僅僅因為我們以相同的方式進行初始化,我們就會得到相同的結果嗎?并非如此,在數學上不可能得出完全相同的結果,因為網路的訓練是一個非決定性的程序。
回到你的例子。如果我在步驟X處保存模型,其權重為Y,如果我繼續訓練,然后加載相同的模型,其權重為Y,并訓練它,model_1(未加載)可能得出權重集Z1,model_2(加載)可能得出權重集Z2。
你也可以在這里查看這個鏈接。用相同的引數反復構建神經網路會得到不同的結果
。確保可重復性的唯一方法(據我所知)是 "播種一切",如下所示:
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也是保證重現性的解決方案。
uj5u.com熱心網友回復:
兩件事:
- 當訓練一個模型時,初始權重是隨機的,也就是說,起始權重將是不同的(關于初始化權重,請看這里。 https://keras.io/api/layers/initializers/
- 你說你在訓練15個 epochs。為什么你要用5個歷時進行3次擬合?為什么不是用15個歷時的一次呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/328128.html
標籤:
下一篇:keras/tensorflow在使用用戶提供的損失函式訓練時出現錯誤("Errorinpy_call_impl[...]ValueError:inusercode")。
