解决pytorch trainloader遇到的多进程问题

 更新时间:2021年05月28日 10:09:08   作者:zhang123454lulu  
这篇文章主要介绍了解决pytorch trainloader遇到的多进程问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

pytorch中尝试用多进程加载训练数据集,源码如下:

trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=3)

结果报错:

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

从报错信息可以看到,当前进程在运行可执行代码时,产生了一个新进程。这可能意味着您没有使用fork来启动子进程或者是未在主模块中正确使用。

后来经过查阅发现了原因,因为windows系统下默认用spawn方法部署多线程,如果代码没有受到__main__模块的保护,新进程都认为是要再次运行的代码,将尝试再次执行与父进程相同的代码,生成另一个进程,依此类推,直到程序崩溃。

解决方法很简单

把调用多进程的代码放到__main__模块下即可。

if __name__ == '__main__':
    transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
    trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
    trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=3)

补充:pytorch-Dataloader多进程使用出错

使用Dataloader进行多进程数据导入训练时,会因为多进程的问题而出错

dataloader = DataLoader(transformed_dataset, batch_size=4,shuffle=True, num_workers=4)

其中参数num_works=表示载入数据时使用的进程数,此时如果参数的值不为0而使用多进程时会出现报错

RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable.

此时在数据的调用之前加上if __name__ == '__main__':即可解决问题

if __name__ == '__main__':#这个地方可以解决多线程的问题

        for i_batch, sample_batched in enumerate(dataloader):

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 利用Python中SocketServer 实现客户端与服务器间非阻塞通信

    利用Python中SocketServer 实现客户端与服务器间非阻塞通信

    本文主要介绍了利用Python中SocketServer 实现客户端与服务器间非阻塞通信示例代码,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • python获取对象信息的实例详解

    python获取对象信息的实例详解

    在本篇文章和里小编给大家整理的是一篇关于python获取对象信息的实例详解内容,有兴趣的朋友们可以学习参考下。
    2021-07-07
  • Python应用实现双指数函数及拟合代码实例

    Python应用实现双指数函数及拟合代码实例

    这篇文章主要介绍了Python应用实现双指数函数及拟合代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python通过调用有道翻译api实现翻译功能示例

    Python通过调用有道翻译api实现翻译功能示例

    这篇文章主要介绍了Python通过调用有道翻译api实现翻译功能,结合实例形式分析了基于Python实现的有道翻译api调用相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • 基于Python实现MUI侧滑菜单a标签跳转

    基于Python实现MUI侧滑菜单a标签跳转

    这篇文章主要介绍了基于Python实现MUI侧滑菜单a标签跳转,mui最接近原生APP体验的高性能前端框架,MUI侧滑常见的场景有下拉刷新,侧滑抽屉,侧滑删除,侧滑返回以及侧滑菜单等等,下面来看看文章内容详细的介绍,需要的朋友可以参考一下
    2021-11-11
  • python实现傅里叶级数展开的实现

    python实现傅里叶级数展开的实现

    这篇文章主要介绍了python实现傅里叶级数展开的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket)

    Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket)

    这篇文章主要介绍了Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • DRF跨域后端解决之django-cors-headers的使用

    DRF跨域后端解决之django-cors-headers的使用

    这篇文章主要介绍了DRF跨域后端解决之django-cors-headers的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • python 循环遍历字典元素的简单方法

    python 循环遍历字典元素的简单方法

    下面小编就为大家带来一篇python循环遍历字典元素的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • python构建深度神经网络(DNN)

    python构建深度神经网络(DNN)

    这篇文章主要为大家详细介绍了python构建深度神经网络DNN,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论