【问题标题】:Why is the accuracy of my CNN not reproducible?为什么我的 CNN 的准确性无法重现?
【发布时间】:2017-07-08 15:56:24
【问题描述】:

我希望我训练的 CNN 获得可重现的结果。因此我将种子设置在my script

import tensorflow as tf
tf.set_random_seed(0)  # make sure results are reproducible
import numpy as np
np.random.seed(0)  # make sure results are reproducible

set_random_seednp.random.seed 的文档没有报告 0 种子的任何特殊行为。

当我在几分钟内在同一台机器上运行相同的脚本两次并且没有进行更新时,我希望得到相同的结果。然而,事实并非如此:

运行 1:

0;0.001733;0.001313
500;0.390164;0.388188

运行 2:

0;0.006986;0.007000
500;0.375288;0.374250

如何让网络产生可重现的结果?

系统

$ python -c "import tensorflow;print(tensorflow.__version__)"                
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.so.8.0 locally
1.0.0

$ python -c "import numpy;print(numpy.__version__)"
1.12.0

【问题讨论】:

  • TF 在运行前应用了一些图形优化/修剪。我不确定该过程是否具有确定性。
  • @Kh40tiK 你知道是否有办法让它具有确定性吗?你知道我可以在哪里寻求这个问题的答案吗?
  • TF mailing listgithub issues 如果缺少此功能。
  • 有人刚刚有了另一个想法,为什么结果可能无法重现:Floating point multiplication is not associative。可能是节点计算其结果的顺序在训练之间有所不同。因此结果不同。

标签: python numpy tensorflow


【解决方案1】:

虽然我没有解决问题,但以下是结果并不总是相同的可能原因(大致从最可能/最容易修复到最不可能/最难修复)。我也尝试在问题出现后给出解决方案。

  1. 人为错误 - 当您将结果从一个 shell 复制到纸上时,您误读了一个数字/打错了字:记录。为您运行的每个实验创建一个2017-12-31-23-54-experiment-result.log。不是手动的, 但实验创造了它。是的,名称中的时间戳更容易再次找到它。对于每个单独的实验,以下所有内容都应记录到该文件中。
  2. 代码已更改:版本控制(例如 git)
  3. 配置文件已更改:版本控制
  4. 伪随机数已更改:为 random / tensorflow / numpy 设置种子(是的,您可能需要设置多个种子)
  5. 数据加载不同/顺序不同:版本控制+种子(预处理真的一样吗?)
  6. 环境变量已更改:Docker
  7. 软件(版本)已更改:Docker
  8. 驱动程序(版本)已更改:日志记录
  9. 硬件更改:日志记录
  10. 硬件/软件存在一些重现性问题。例如floating point multiplication is not associative 和 GPU 上的不同内核可能会在不同的时间完成计算(我不确定)
  11. 硬件有错误

在任何情况下,多次运行“相同”的事物可能有助于对事物的不同之处有一个直觉。

写论文

如果你写一篇论文,我认为以下是再现性的最佳实践:

  1. 添加指向所有代码所在的存储库(例如 git)的链接
  2. 代码必须容器化(例如 Docker)
  3. 如果有 Python 代码和 requirements.txt,您必须提供确切的软件版本,而不是 tensorflow>=1.0.0,而是 tensorflow==1.2.3
  4. 添加您用于实验的版本的 git hash。如果您在两者之间进行了更改,则可能是不同的哈希值。
  5. 始终记录有关驱动程序(例如like this for nVidia)和硬件的信息。将此添加到论文的附录中。因此,如果以后发生更改,至少可以检查是否存在可能导致数字不同的更改。

要记录版本,您可能需要使用以下内容:

#!/usr/bin/env python

# core modules
import subprocess


def get_logstring():
    """
    Get important environment information that might influence experiments.

    Returns
    -------
    logstring : str
    """
    logstring = []
    with open('/proc/cpuinfo') as f:
        cpuinfo = f.readlines()
    for line in cpuinfo:
        if "model name" in line:
            logstring.append("CPU: {}".format(line.strip()))
            break

    with open('/proc/driver/nvidia/version') as f:
        version = f.read().strip()
    logstring.append("GPU driver: {}".format(version))
    logstring.append("VGA: {}".format(find_vga()))
    return "\n".join(logstring)


def find_vga():
    vga = subprocess.check_output("lspci | grep -i 'vga\|3d\|2d'",
                                  shell=True,
                                  executable='/bin/bash')
    return vga


print(get_logstring())

它给出了类似的东西

CPU: model name    : Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
GPU driver: NVRM version: NVIDIA UNIX x86_64 Kernel Module  384.90  Tue Sep 19 19:17:35 PDT 2017
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5)
VGA: 00:02.0 VGA compatible controller: Intel Corporation Skylake Integrated Graphics (rev 06)
02:00.0 3D controller: NVIDIA Corporation GM108M [GeForce 940MX] (rev a2)

【讨论】:

    【解决方案2】:

    可能是范围问题。确保在使用图表的范围内设置种子,例如之后

    with tf.Graph().as_default()
     tf.set_random_seed(0)
    

    这也必须在调用tf.reset_default_graph() 之后完成。

    有关完整示例,请参阅How to get stable results with TensorFlow, setting random seed

    【讨论】:

    • tf.reset_default_graph后面加上后,第一个epoch是一致的。但是,经过一段时间的训练,结果会有所不同。我进行了 5 次运行,但没有一个结果相同,而所有结果都非常相似:pastebin.com/7j4SPS5V
    猜你喜欢
    • 2018-06-15
    • 2016-09-10
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多