【问题标题】:Keras save_model() and load_model() methods not working as expectedKeras save_model() 和 load_model() 方法无法按预期工作
【发布时间】:2021-11-13 19:48:20
【问题描述】:

考虑以下代码:

from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam

def build_model():
    model = Sequential()
    model.add(Dense(units=64, kernel_initializer='uniform', activation='relu'))
    model.add(Dense(units=128, kernel_initializer='uniform', activation='relu'))
    model.add(Dense(units=64, kernel_initializer='uniform', activation='relu'))
    model.add(Dense(units=1, kernel_initializer='uniform', activation='relu'))
    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") # Saving the model before further fitting.
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 个 epoch 并进行预测。最终模型未保存。 之后,加载保存的模型(前 10 个 epoch 之后的拟合)并执行与上述相同的过程(进一步拟合和预测)。 两个预测的结果应该是相同的,因为应该使用相同的模型,但是,它们不是。知道这可能是什么原因吗? 以下是我得到的结果:

--------------------------------
[[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 ]]
--------------------------------

Process finished with exit code 0

【问题讨论】:

    标签: python tensorflow keras deep-learning neural-network


    【解决方案1】:

    您的理由是正确的,但我认为(原因之一)这里的不同结果是由于训练的随机方式造成的。

    假设我们都有相同的网络,我们以相同的方式对其进行初始化,我们使用 Xavier 初始化。

    那么我们是否得到相同的结果,只是因为我们以相同的方式初始化?并非如此,在数学上不可能得出完全相同的结果,因为网络的训练是一个不确定的过程。

    回到你的例子。如果我在步骤X 保存模型,权重Y,如果我继续训练,然后加载相同的模型,具有相同的权重Y,并训练它,model_1(未加载)可以到达一组权重Z1model_2(已加载)可以到达一组权重Z2

    您也可以在此处查看此链接:Building Neural Network over and over with same parameters give different result

    确保再现性的唯一方法(据我所知)是“播种一切”,如下所示:

    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 也是一种确保重现性的解决方案。

    【讨论】:

      【解决方案2】:

      两件事:

      • 训练模型时,初始权重是随机的,即起始权重会不同(有关初始化权重,请参见此处: https://keras.io/api/layers/initializers/
      • 您说您要训练 15 个 epoch。为什么用 5 个 epoch 拟合 3x 次?为什么不是 15 个 epoch 的一次?

      【讨论】:

      • 1.模型的权重应该无关紧要,因为两次我都应该使用相同的模型。 2. 没有区别。我已将代码一次更改为 15 个 epoch,以使示例更易于阅读。问题依然存在。
      猜你喜欢
      • 2017-09-22
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2021-04-23
      相关资源
      最近更新 更多