首页 > 解决方案 > 无法使用 Keras 重现结果

问题描述

我正面临着 keras 的谜团。我正在遵循“Practical machine learning with python”一书中显示的示例。

我执行以下命令

    import keras
    from sklearn.datasets import load_breast_cancer
    cancer = load_breast_cancer()
    X_train = cancer.data[:340]
    y_train = cancer.target[:340]
    X_test = cancer.data[340:]
    y_test = cancer.target[340:]
    from keras.models import Sequential
    from keras.layers import Dense, Dropout
    model = Sequential()
    model.add(Dense(15, input_dim=30, activation='relu'))
    model.add(Dense(15, activation='relu'))
    model.add(Dense(15, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
    model.fit(X_train, y_train, epochs=20, batch_size=50)

这是最后一行的输出(我只粘贴准确性和损失)

    loss: 0.4130 - acc: 0.8500

    loss: 0.2211 - acc: 0.9147

    loss: 0.4366 - acc: 0.8441

    loss: 0.2292 - acc: 0.9118

    loss: 0.2547 - acc: 0.9029

    loss: 0.2399 - acc: 0.8941

    loss: 0.4907 - acc: 0.8618

    loss: 0.3180 - acc: 0.8853

    loss: 0.2452 - acc: 0.9029

    loss: 0.4381 - acc: 0.8588

    loss: 0.2242 - acc: 0.9029

    loss: 0.2700 - acc: 0.8941

    loss: 0.2022 - acc: 0.9118

    loss: 0.3545 - acc: 0.8559

    loss: 0.3242 - acc: 0.8882

    loss: 0.2504 - acc: 0.9147

    loss: 0.5074 - acc: 0.8676

    loss: 0.1980 - acc: 0.9353

    loss: 0.3794 - acc: 0.8882

    loss: 0.2567 - acc: 0.9000

然后我对具有不同名称的同一模型重复相同的步骤

    model2 = Sequential()
    model2.add(Dense(15, input_dim=30, activation='relu'))
    model2.add(Dense(15, activation='relu'))
    model2.add(Dense(15, activation='relu'))
    model2.add(Dense(1, activation='sigmoid'))
    model2.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
    model2.fit(X_train, y_train, epochs=20, batch_size=50)

这是最后一行的输出(同样,我将只显示 acc. 和 loss)

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

     loss: 7.3616 - acc: 0.5382

为什么我没有得到相同的结果(更高的准确性和更少的损失)?

非常感谢

标签: pythonkeras

解决方案


这是完全正常的。

模型权重是随机初始化的。有时一个模型比另一个模型开始时运气更好。

由于您使用的是“relu”并且只有几个神经元 (15),因此您的所有 relu 输出也有可能为零,这不会发生反向传播。这会导致模型冻结,就像您的第二个示例一样。

为了使用“relu”激活,必须选择适当的权重初始化和适当的学习率来避免这种影响。(不过,我不是这方面的专家)。

如果您想看到可重现的结果,您需要在运行代码之前设置一个恒定的随机种子。(而且当你想创建一个新模型时,你可能需要重新启动你的 python 内核)

import random
random.seed(chooseAnInteger)

推荐阅读