Pytorch 错误:“BiSeNet”对象没有属性“模块”

Posted

技术标签:

【中文标题】Pytorch 错误:“BiSeNet”对象没有属性“模块”【英文标题】:Pytorch error: 'BiSeNet' object has no attribute 'module' 【发布时间】:2021-08-11 06:53:32 【问题描述】:

我是 pytorch 的新手,我正在尝试研究 BiSeNet 的图像分割(代码取自 github 存储库:https://github.com/ooooverflow/BiSeNet/blob/master/train.py)。在训练阶段,在经过一些训练 epoch 之后,网络会进行验证,如果 val 的结果优于之前的结果,则尝试保存模型的参数。 在最后一次操作中,我在第 109 行(以及训练期间的第 102 行)中收到此错误:

AttributeError: 'BiSeNet' object has no attribute 'module'

这里不贴所有代码,只贴主要步骤。

首先,他们是这样构建模型的:

os.environ['CUDA_VISIBLE_DEVICES'] = args.cuda
model = BiSeNet(args.num_classes, args.context_path)
if torch.cuda.is_available() and args.use_gpu:
        model = model.cuda()

因此存在一个 BiSeNet 对象,这要归功于一个名为“model”的导入模块,其中有一个名为 build_BiSeNet.py 的文件;在此脚本中,定义了 BiSeNet 类,并且没有名为 module 的属性。 查看 pytorch 文档,似乎在 Model 类中有一个名为 modules 的属性,其中包含我要保存的模块。 在文档中,他们还建议执行torch.save(model.state_dict(), ...) 以保存模型,而不调用模块属性,我喜欢在第 109 行完成)

所以,最后,我的问题是:为了避免给我带来的错误,我应该删除第 109 行(以及第 102 行)中的 .module 还是将此属性更改为 .modules?

【问题讨论】:

我怀疑 .module 是原始代码中并行 GPU 训练的“剩余部分”。如果您没有使用任何并行性,我认为从有问题的行中删除 .module 是安全的。 【参考方案1】:

看看他们的demo.py,他们正在定义模型:

model = BiSeNet(args.num_classes, args.context_path)
if torch.cuda.is_available() and args.use_gpu:
  model = torch.nn.DataParallel(model).cuda()

一旦你用nn.DataParallel 包裹model,你就会得到一个“额外的”.module。 保存的检查点没有这个额外的.module,因此在加载保存的检查点时:

model.module.load_state_dict(torch.load(args.checkpoint_path))

不是直接加载到model,而是加载到model.module

【讨论】:

以上是关于Pytorch 错误:“BiSeNet”对象没有属性“模块”的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch DataLoader 错误:“类型”类型的对象没有 len()

Pytorch 中的错误:libcudart.so.10.2:无法打开共享对象文件:没有这样的文件或目录

Pytorch N - Beats 模型抛出错误:“str”对象没有属性“__name__”

AttributeError:“str”对象在 pytorch 中没有属性“dim”

引用量超1400的经典语义分割方法BiSeNet解读

YOLOv5+BiSeNet——同时进行目标检测和语义分割