在所有模块中为火炬、随机数和 numpy 设置相同的种子

Setting the same seed for torch, random number and numpy throughout all the modules

我试图在整个项目中设置相同的种子。 以下是我在主文件中设置的参数,其中将导入所有其他模块 -

seed = 42
os.environ['PYTHONHASHSEED'] = str(seed)
# Torch RNG
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
# Python RNG
np.random.seed(seed)
random.seed(seed)

我的项目目录如下所示 -

├── Combined_Files_without_label5.csv
├── __pycache__
│   ├── dataset.cpython-37.pyc
│   ├── datasets.cpython-37.pyc
│   └── testing.cpython-37.pyc
├── datasets.py
├── import_packages
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   ├── dataset.cpython-37.pyc
│   │   ├── dataset_class.cpython-37.pyc
│   │   ├── dataset_partition.cpython-37.pyc
│   │   └── visualising.cpython-37.pyc
│   ├── dataset_class.py
│   ├── dataset_partition.py
│   └── visualising.py
├── main.py

现在,问题是我正在从 dataset_partition.py 导入模块,并且该函数需要一个 seed 值。例如 -

    df_train, df_temp, y_train, y_temp = train_test_split(X,
                                                      y,
                                                      stratify=y,
                                                      test_size=(1.0 - frac_train), # noqa
                                                      random_state=seed) 

现在,我的问题是,
1) 如果我只是从上面的语句中删除 random_state 参数,它会从我的主文件中获取种子吗?
如果没有,那怎么设置呢?
2)是否所有其他需要种子的函数如torch.manual.seedtorch.cuda.manual_seed(seed)会以同样的方式表现?(如果不是,那么如何解决它)

1)If I just remove the random_state parameter from the above statement so will it take the seed from my main file?

是的,因为默认 (None) 值的 docs 表示:

Use the global random state instance from numpy.random. Calling the function multiple times will reuse the same instance, and will produce different results.

当你在 __init__ 中使用它时,我想,它将 运行 在你从你的包中使用的任何其他功能之前,你没问题。

2)Does all the other function which requires seed like torch.manual.seed, torch.cuda.manual_seed(seed) will behave in the same way?

是的,这些将为 Python 和 PyTorch 设置全局种子,你在这里也很好。