python - 无法使用 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
为什么我没有得到相同的结果(更高的准确性和更少的损失)?
非常感谢
解决方案
这是完全正常的。
模型权重是随机初始化的。有时一个模型比另一个模型开始时运气更好。
由于您使用的是“relu”并且只有几个神经元 (15),因此您的所有 relu 输出也有可能为零,这不会发生反向传播。这会导致模型冻结,就像您的第二个示例一样。
为了使用“relu”激活,必须选择适当的权重初始化和适当的学习率来避免这种影响。(不过,我不是这方面的专家)。
如果您想看到可重现的结果,您需要在运行代码之前设置一个恒定的随机种子。(而且当你想创建一个新模型时,你可能需要重新启动你的 python 内核)
import random
random.seed(chooseAnInteger)
推荐阅读
- string - kdb/q:如何连接字符串列表中的相邻元素,中间有空格?
- tizen - 如何使用 EDC 更改文本的样式?
- ios - 如何在循环中创建的视图上处理 UITapGestureRecognizer?
- node.js - 将数据从节点 js 传递到 EJS 时未定义错误
- c# - ASP.NET Core Json 对象的格式很奇怪,使用 \u0022
- json - 使用 SwiftyJSON 解析 JSON 响应
- reactjs - 如何使用 React Link 和 Routes 修复此错误
- javascript - React:如何在没有 PUBLIC_URL 出现在路由中的情况下提供资产?
- c# - 根据类的当前实现,通过直接枚举将 ConcurrentDictionary 复制到普通字典是否安全?
- java - java.lang.IllegalArgumentException:在方法名称中发现无效字符。HTTP 方法名称必须是 Spring 和 Android 中的标记