Keras 神经网络在两种不同硬件上的结果完全不同(一个是 AWS)

数据挖掘 Python 深度学习 喀拉斯 回归 aws
2021-09-20 08:57:37

我有一个 Keras 模型。定义如下:

nn_model = Sequential()
nn_model.add(Dense(300, activation="relu",input_shape=(4,))) # because we have 4 features
nn_model.add(Dropout(0.3))
nn_model.add(Dense(150, activation="relu"))
nn_model.add(Dense(50, activation="relu"))
nn_model.add(Dense(30, activation="relu"))
nn_model.add(Dense(1))

optimizer = optimizers.RMSprop(0.001)      
nn_model.compile(loss='mse',optimizer=optimizer,metrics=['mae']) 

该模型用作预测特定模式的回归器。对于相同的训练和测试数据以及相同的代码,该模型在两种不同的硬件上做出两种完全不同的预测。在一种情况下,权重完全损坏并做出平坦的预测(训练数据没有平坦的曲线)。

两台机器上使用的库版本相同。

以下是两台机器的规格:

正确预测机器:联想 ThinkPad E570 机型类型:Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz

错误预测(AWS VM):机器类型:c5.large

谁能指出可能发生这种情况的任何原因?

2个回答

Keras 中模型/预测的一致性取决于以下几点:

  • 软件堆栈:最不常见的问题,有时不同版本的数值软件存在差异,可能会改变结果。

  • 后端区别:Keras 支持 TensorFlow 后端、Theano 后端和 CNTK 后端。所有这些都会产生略有不同的模型。在 python 控制台中,您可以使用类似于以下内容的消息检查版本:

    使用 TensorFlow 后端。

您可以使用以下指南切换后端:后端实用程序 | 喀拉斯

  • 设置种子:为了在模型之间保持一致性,您需要相应地设置随机种子。对于 Keras 和 Tensorflow 后端,您需要设置两个随机种子:

在 numpy

从 numpy.random 导入种子

种子(123)

在张量流中

从张量流导入 set_random_seed

设置随机种子(123)

在 Tensorflow 的图表的某些部分中设置种子的其他更复杂的细节在这个 Stack Overflow 答案和Tensorflow 网站上的 set_random_seed() API 文档中得到了更好的解释。

直观地说,在您的问题中,随机性的来源来自没有在 numpy 和 Tensorflow 中设置适当的种子,所以从那里开始并开始探索其他选项和文档。另请记住,如果您使用不同的后端(Theano 或 CNTK),设置种子将需要调用不同的函数。

另一个建议是查找脚本中的错误、下载的二进制文件的版本、安装过程中的警告和错误,以防结果差异太大。如果一个实例未按预期执行并且可能需要全新安装,则可能会出现问题。

问题出在 AWS 的 CPU 积分系统中。显然,这些学分的限制正在受到影响,这会影响模型的训练。在增加 AWS 实例的 CPU 积分后,该实例的性能开始与本地可用的性能匹配。