使用相同的设置运行Keras model.fit()会返回不同的结果

时间:2019-01-23 17:06:17

标签: machine-learning random keras

我在model_path中保存了一个受过训练的模型,并且我希望从固定的数据状态开始,多次对一组固定的数据进行训练。如果我在相同的固定训练数据集上运行相同的优化,并且明确定义了Python,Numpy和Tensorflow的随机种子生成器,那么我期望在相同的测试集上获得相同的结果。我按照Keras FAQ上有关可重复结果的说明进行操作,但这似乎无济于事。

我的模型是一堆relus和顶部的线性层。没有批次规范化或退出。随机性的唯一来源可能是He权重初始化,但由于我已经训练了加载的模型,所以它实际上并没有出现。

for i in range(3): 
    # set random seeds
    tf.set_random_seed(42)
    np.random.seed(42)
    random.seed(42)
    # get training and test data
    x_test = scaler.transform(df.iloc[150:350,0:12].values)
    y_test = df.iloc[150:350,12].values
    X = scaler.transform(df.iloc[0:150,0:12].values)
    Y = df.iloc[0:150,12].values
    # load and fit model
    model = load_model(model_path)
    model.compile(loss='mae', optimizer='adam')
    _ = model.fit(X, Y, batch_size=150, epochs=20, verbose=0, shuffle=False)
    # evaluate model
    mae = model.evaluate(x=x_test, y=y_test, steps=test_amount//50, verbose=0)
    print('MAE: ', mae)
    K.clear_session()
    tf.reset_default_graph()

这将导致:

MAE:  12.2394380569458
MAE:  12.65652847290039
MAE:  9.243626594543457

此外,我没有在GPU上运行。 造成这些差异的原因是什么?

1 个答案:

答案 0 :(得分:-1)

尝试将优化程序从'adam'更改为SGD。我遇到了完全相同的问题,这解决了。