PyTorch dataloader 中的随机数

本文探讨了在PyTorch训练过程中,使用Dataloader时遇到的随机数问题。当worker数量大于1时,每个worker生成的随机数序列相同。作者通过测试发现,这是因为子进程继承了父进程的seed。解决方法是配置NumPy和PyTorch的seed,以确保每个worker生成不同的随机数序列。PyTorch内部已为不同worker设置不同seed,但未配置NumPy,因此默认情况下NumPy的random函数会输出相同序列。
摘要由CSDN通过智能技术生成

起因

最近用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__"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值