在Spyder中运行PyTorch分类嵌入神经网络出现AttributeError如何解决
问题原因
这个报错是Spyder默认的交互式IPython运行环境和Python多进程的spawn启动模式不兼容导致的:Windows系统下多进程默认使用spawn模式,子进程启动时需要重新序列化导入主模块的自定义类,而Spyder的交互控制台的__main__模块是内置环境,子进程没法正确读取到你在控制台里定义的TabularDataset类。
注意:不要直接修改Python标准库的spawn.py文件,会破坏Python环境兼容性,且会导致后续其他代码运行异常。
可行解决方案
按优先级从高到低排列:
方案1:关闭DataLoader多进程(最简便)
直接修改你代码里DataLoader的num_workers参数为0,强制用主进程加载数据,小批量数据场景下几乎不会有明显的性能损失,完全能满足学习需求:# 把原来的num_workers=1改成num_workers=0 dataloader = DataLoader(dataset, batchsize, shuffle=True, num_workers=0)修改后直接运行即可,不需要调整其他代码。
方案2:用独立Python进程运行脚本
如果你需要用到多进程加速数据加载,不要在Spyder默认的交互控制台运行脚本,右键你的.py脚本文件,选择「Run in new dedicated Python interpreter」(在独立Python解释器中运行),同时确保所有非类/函数定义的业务代码都包裹在if __name__ == '__main__':代码块中,就能正常使用多进程功能。方案3:拆分自定义类到独立模块
把你定义的TabularDataset、FeedForwardNN两个类单独存到一个新的Python文件中,比如命名为custom_modules.py,然后在主运行脚本中导入这两个类:from custom_modules import TabularDataset, FeedForwardNN这样子进程序列化时可以从独立导入的模块中找到对应类,也能解决属性找不到的报错。
内容的提问来源于stack exchange,提问作者Ted

