detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

问题来源:在使用FB的框架detectron2改写模型的时候碰到了KeyError: "No object named 'XXXXX' found in 'BACKBONE' registry!"的bug。

分析:detectron2中自定义的模型都需要注册,这一点官方的文档中已经提到,上图是官方给出的标准模型注册code,我照着官方文档改写代码还是报错,我的代码如下:

可以看到,我已经像文档所说的那样使用装饰器注册了我自己的backbone,但是运行train_net.py还是会报错找不到自定义的backbone。

再次翻看detectron2官方给出的TridentNet的代码,并没有发现有什么不一样,上图:

我的代码也是仿照着TridentNet的结构写的,所以应该不会有大的问题,但是有一个小细节引起了我的注意,这个细节是TridentNet的目录结构:

可以看到TridentNet中有一个文件叫做init.py,这个文件是做什么的大家可以自行百度python工程中init.py的作用,这里不再赘述。

再次查询github:

开发者给出的回答是代码没有导入,其实问题已经浮现出来了,其实就是你虽然装饰了你的backbone或者模型,但是根本就没有执行你的那段代码,我的代码结构如下:

造成这个的原因是因为新建net这个文件夹的时候选择的是directory而不是python package,区别就是会不会为你生成init.py,区别不再赘述,所以自己弄一个,或者重新新建,把net文件改为python package,改完如下:

 

在init.py里面导入自己写的模块:

再在自己的训练文件train_net.py里导入net时,就会将它视为一个package并执行_init_.py

这样你注册的模型的那段代码才得到了执行。

这样问题得以解决,造成这个问题的原因还是自己的python基础太过薄弱,早就注意到了TridentNet的目录里有init文件,不知道有什么在作用放着没管,结果最后确实是这个问题造成的bug。

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 好的,您的第三个问题是出现了'AttributeError: 'MobileNetV2' object has no attribute 'backbone''的错误。 这个错误通常是由于没有正确加载预训练的模型权重导致的。在使用预训练模型时,我们需要先加载预训练的权重,然后再将其作为特征提取器或者基础模型来进行后续的训练或者推理。 在使用MobileNetV2模型时,可以尝试如下代码来加载预训练的权重: ``` import tensorflow as tf from tensorflow.keras.applications import MobileNetV2 model = MobileNetV2(include_top=False, weights='imagenet') ``` 在这个例子中,我们使用`weights='imagenet'`参数来加载预训练的权重。同时,`include_top=False`参数可以用来指定是否包含全连接层,如果我们只需要使用MobileNetV2作为特征提取器,那么可以将其设置为False。 如果您已经正确加载了预训练的模型权重,但是仍然出现了这个错误,那么可能是由于模型的实现代码存在问题。您可以检查一下代码中是否存在拼写错误、大小写错误等问题,并确保代码与TensorFlow版本兼容。 ### 回答2: AttributeError: 'MobileNetV2' object has no attribute 'backbone' 是一个错误信息,意味着在使用MobileNetV2模型时,出现了找不到'backbone'属性的错误。 这个错误通常出现在代码中使用了一个没有'backbone'属性的MobileNetV2对象。可能的原因是,代码中对MobileNetV2对象的使用方式不正确,或者MobileNetV2模型的实现中没有定义'backbone'属性。 要解决这个错误,我们可以采取一些步骤: 首先,检查代码中对MobileNetV2对象的使用方式。确保在创建和调用MobileNetV2对象时,使用的方法和属性是正确的。比如,检查是否正确导入了MobileNetV2模型,并检查代码中是否正确调用了MobileNetV2对象的方法和属性。 如果代码中对MobileNetV2对象的使用方式没有问题,那么可能是MobileNetV2模型的实现没有定义'backbone'属性。在这种情况下,我们可以尝试查找MobileNetV2的定义或者文档,确认它是否有'backbone'属性。如果没有'backbone'属性,那么我们需要改变代码的逻辑或者使用其他方法。 总之,要解决这个错误,我们需要仔细检查代码对MobileNetV2对象的使用方式,并确认MobileNetV2模型是否有定义'backbone'属性。根据具体情况,适当修改代码或者采用其他方法来解决这个错误。 ### 回答3: AttributeError是Python中的一个错误类型,当尝试访问一个对象上不存在的属性时会引发此错误。根据错误提示信息可以得知,在MobileNetV2对象上没有名为'backbone'的属性。 MobileNetV2是一个预训练的深度学习模型,用于图像分类和特征提取任务。通常,我们需要调用模型的'backbone'属性来访问模型的主干网络(backbone network),用于提取图像特征。 出现这个错误可能有以下几种原因: 1. 没有正确导入MobileNetV2模块,或者没有正确实例化MobileNetV2对象。需要检查代码中是否正确导入了MobileNetV2模块,并且是否正确创建了模型实例。 2. 如果代码正确导入和实例化了MobileNetV2模型,但仍出现错误,可能是使用的模型版本不兼容。MobileNetV2的不同版本可能具有不同的属性和方法。需要确认代码和模型版本之间的兼容性,并根据实际情况进行方法调用。 3. 可能是代码中错误地使用了'mobilenetv2.backbone'这个属性名。需要检查代码中是否存在这个错误的属性名,并修改为正确的属性名。 为了解决这个问题,可以进行以下几步: 1. 确认代码中已正确导入MobileNetV2模块,并正确实例化了MobileNetV2对象。 2. 检查代码和模型版本之间的兼容性,根据实际情况进行方法调用。 3. 检查代码中是否存在错误的属性名,并修改为正确的属性名。 4. 如果以上步骤都没有解决问题,可以尝试重新安装或更新MobileNetV2模块。 总之,通过检查代码和模型的正确性以及属性名的准确性,可以解决这个错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值