我正面临与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
为什么我没有得到相同的结果(准确度更高,损失更小)?
非常感谢
答案 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'))
感谢大家的帮助