起因
最近用PyTorch训练一个新的CNN,需要在输入的训练图像上增加简单的噪声,最开始是利用NumPy提供的随机数函数去添加噪声,基于PyTorch提供的dataloader进行图像加载。在使用dataloader时,发现当worker数量大于1时,每个worker生成的随机数的序列是完全一样的。虽然每次启动dataloader,NumPy给出的随机数序列不同,但是每个worker使用的是一模一样的随机数列。这是我不需要的行为。
思考
简单思考一下,原因可能是当使用一个以上的worker时,dataloader采用python的multiprocessing package,生成多个进程去加载数据,在生成进程后,各个子进程没有各自生成自己独立的seed,而是继承了父进程的seed,从而各自生成的随机数列是完全一致的。于是进行了简单的测试
from __future__ import print_function
from multiprocessing import Process
import os
import numpy as np
import torch
def func(name, n=4):
np.random.seed( int(os.getpid()) )
for i in range(n):
print("%s: %d, np.random.randn(1) = %+f, torch.randn(1) = %+f. " % ( name, i, np.random.randn(1), torch.randn(1) ))
if __name__ == "__main__"