【问题标题】:Why does my keras neural network model output different values on a different machine?为什么我的 keras 神经网络模型在不同的机器上输出不同的值?
【发布时间】:2017-07-15 22:25:46
【问题描述】:

我正在使用 aws ec2 为多标签分类任务训练模型。训练后,我在同一台机器上测试了模型,结果很好(准确率 90+%)。但是,在我将保存的模型导入本地机器(无 GPU)后,它会给出不同的结果(准确率小于 5%)。关于为什么会发生这种情况的任何建议?谢谢。

TL;DR:Keras/tensorflow 模型在 从 GPU 机器转移到 CPU 时会产生不同的结果。

【问题讨论】:

  • 那么你用什么数据训练你的模型,这取决于如何对其进行编程。
  • 我正在处理文本数据(推文)。我根据他们表达的情绪(快乐、悲伤、愤怒等)对它们进行分类。我在张量流上使用 keras。我的网络是一个顺序模型(嵌入层-> 双向 LSTM-> sigmoid 密集层)。我正在使用 binary_crossentropy (因为我想有多个 0/1 情绪输出)和 rmsprop 用于优化器。它在 aws 中运行良好,但在我的本地机器上却不行。
  • 我已经将本地机器上的 keras 和 tensorflow 版本更改为与 aws 中相同的版本。现在唯一的区别是我在笔记本电脑上使用 CPU 版本,而 aws ec2 使用 gpu。但是,与 aws 相比,我本地机器中的输出仍然倾向于提供非常不同的输出。
  • 你应该提供代码和你得到的结果,否则这个问题是完全无法回答的。
  • @MatiasValdenegro 先生,我的代码基于 Alexander Rakhlin 爵士发布的 github code。我将其修改为使用 RNN 来代替多种情绪输出。我在 aws ec2 机器上获得了 90% 以上的准确率,而在没有 GPU 的笔记本电脑上只有 5% 的准确率。我对这种行为进行了一些搜索,发现原因是 GPU 机器上使用的 cuDNN 产生了使模型随机化的不确定值。我通过一些链接发布了我找到的解决方案。

标签: amazon-ec2 keras recurrent-neural-network


【解决方案1】:

在网上搜索后,我发现了问题。在 GPU 上运行时,keras over tensorflow 似乎会产生在转移到非 GPU 机器时无法重现的结果。这很可能与安装的 cuDNN 有关。 cuDNN 的最大池化和一些卷积后向算法是不确定的 - 正如论坛所说。

我发现的解决方案是在调用任何 keras 库之前使用 numpy.random.seed(seed_no)。这在您在 CPU 上 运行代码时有效。适用于 keras/theano 和 keras/tensorflow。

GPU 用户使用 keras over theano 的解决方案涉及modifying the .theanorc file into:

[dnn.conv]
algo_bwd_filter = deterministic
algo_bwd_data = deterministic

或using theano flags:THEANO_FLAGS="dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic" python rnn_model.py

但是,我还没有找到任何关于如何在 keras 上以 tensorflow 作为后端在 GPU 上运行的明确说明。

【讨论】:

  • 您好,感谢您的回答! numpy.random.seed 的参数 seed_no 是什么?你知道为什么调用它会阻止 cuDNN 是不确定的吗?谢谢!
  • @Pusheen_the_dev 先生,seed_no 是一个整数变量,用于控制 numpy 的随机状态,使结果可预测。您可以查看更多信息here。据我所知,keras 使用 numpy 来随机化模型的初始权重。因此,设置种子来控制这种随机状态将使模型的输出产生统一的实验结果。但是,播种不会阻止 cuDNN 的不确定性,因为它是安装时的默认设置。您可以为此使用 theano 标志。
猜你喜欢
  • 2015-01-10
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2021-12-06
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多