无法使用Keras重现结果

时间:2018-05-24 15:54:25

标签: python keras

我正面临与keras的混淆。我正在按照“使用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

为什么我没有得到相同的结果(准确度更高,损失更小)?

非常感谢

2 个答案:

答案 0 :(得分:1)

这是完全正常的。

模型权重随机初始化。有时,模型开始时运气好于另一个模型。

因为您正在使用" relu"而且只有少数神经元(15),你的所有relu输出都有可能为零,这样反向传播就不会发生。这会产生一个冻结的模型,就像你的第二个例子一样。

使用" relu"必须选择激活,适当的重量初始化和适当的学习速率以避免这种影响。 (不过,我不是这方面的专家)。

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

import random
random.seed(chooseAnInteger)

答案 1 :(得分:0)

我通过指定kernel_initializer

解决了这个问题
model.add(Dense(15, activation='relu', kernel_initializer='random_uniform'))

感谢大家的帮助