deel123 2023-03-20 13:06 采纳率: 50%
浏览 41
已结题

剪枝后权重文件导入失败

请教下我用yolov5剪枝后微调后,需要检测一下效果好坏,但是现在出现了权重文件无法导入的情况,不知道问题出在了什么地方?下面是出问题的代码部分,请帮我看看问题在什么地方?


model = DetectPrunedMultiBackend(weights, device=device, dnn=dnn)   # 这是模型导入和重构的类
model = attempt_load_pruned(weights if isinstance(weights, list) else w, map_location='cpu')   在这个类内用attempt_load_pruned()来导入权重
 ckpt = torch.load(attempt_download(w), map_location=map_location)  # 问题出在了这个地方

显示的错误是这样的


 File "D:\anaconda\envs\mmyolo\lib\site-packages\torch\serialization.py", line 875, in find_class
    return super().find_class(mod_name, name)
ModuleNotFoundError: No module named 'yolo_pruned'

显示找不到这个模块。我在netron中也能导入权重可视化。

    class UnpicklerWrapper(pickle_module.Unpickler):  # type: ignore[name-defined]
        # from https://stackoverflow.com/questions/13398462/unpickling-python-objects-with-a-changed-module-path/13405732
        # Lets us override the imports that pickle uses when unpickling an object.
        # This is useful for maintaining BC if we change a module path that tensor instantiation relies on.
        def find_class(self, mod_name, name):
            mod_name = load_module_mapping.get(mod_name, mod_name)
            return super().find_class(mod_name, name)

我用1.10版本和1.13版本都测试了,不行。显示同样的错误。

  • 写回答

10条回答 默认 最新

  • 蓝白、波罗歌 2023-03-20 19:35
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    根据你提供的信息,问题可能出在权重文件中使用了之前的自定义模块,在加载权重文件时找不到该模块从而导致错误。你可以尝试重新定义该自定义模块并加载权重文件。具体步骤如下:

    1. 找出使用了自定义模块的权重文件中的自定义模块名称

    在 YOLOv5 中,常见的自定义模块包括 Focus, ConvBottleneckCSP 等。你可以通过查看模型定义文件中的模块定义来确定使用了哪些模块。

    1. 重新定义自定义模块

    假设使用了 BottleneckCSP 模块,你可以在模型定义文件中重新定义该模块:

    class NewBottleneckCSP(nn.Module):
        def __init__(self, c1, c2, n=1, depthwise=False, gw=False, expansion=0.5, sa=False):
            super(NewBottleneckCSP, self).__init__()
            c_ = int(c2 * expansion)  # hidden channels
            self.cv1 = Conv(c1, c_, 1, stride=1)
            self.cv2 = Conv(c1, c_, 1, stride=1)
            self.cv3 = Conv(2 * c_, c2, 1, stride=1)
            self.m = nn.Sequential(*[Bottleneck(c_, c_, depthwise=depthwise, gw=gw, sa=sa) for _ in range(n)])
    
        def forward(self, x):
            y1 = self.cv2(F.relu(self.cv1(x)))
            y2 = self.m(self.cv3(F.relu(y1)))
            return torch.cat((y1, y2), dim=1)
    
    1. 使用重新定义后的模块加载权重文件

    在加载权重文件时,你需要指定 map_location 参数为 "cpu" 并且添加一个 module_mapping 参数,将旧模块名称映射到新模块名称。比如:

    from utils.torch_utils import attempt_load_pruned
    
    weights = 'path/to/pruned/weights.pt'
    # 将旧模块 "BottleneckCSP" 映射到新模块 "NewBottleneckCSP"
    module_mapping = {'BottleneckCSP': 'NewBottleneckCSP'}
    
    model = attempt_load_pruned(weights, map_location='cpu', module_mapping=module_mapping)
    

    以上步骤中 attempt_load_pruned() 函数是 YOLOv5 提供的加载权重文件的便捷函数,可以实现自动转换权重文件、构建模型等功能,你可以根据需要修改其中的参数。
    如果我的回答解决了您的问题,请采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • lshen01 2023-03-20 13:23
    关注

    参考GPT和自己的思路:

    根据你提供的信息,问题可能出在模块的导入和命名上。错误提示显示找不到 yolo_pruned 模块,可能是因为在导入时路径或命名有误。

    建议你检查一下模型导入时 load_module_mapping 的映射关系是否正确,并检查模块名称是否与实际名称一致。另外,你也可以查看模型导出时的模块路径,确保导入时路径正确。

    另外,如果你在 Netron 中能够成功导入权重,说明权重文件本身应该没有问题,也可以考虑直接加载 Netron 中显示的权重路径。如果问题仍然存在,可以提供更多相关代码和错误信息以便进一步诊断。

    评论
  • 追cium 2023-03-20 13:25
    关注

    参考GPT和自己的思路:

    根据你提供的信息,可能是因为在attempt_load_pruned()函数内部尝试导入一个名为'yolo_pruned'的模块,但是并不存在这个模块导致的错误。你可以尝试在你的代码中搜索一下'yolo_pruned'这个字符串,看看是否存在相关的导入代码。如果没有找到,可以尝试将导入权重相关的代码放在同一个文件夹下,并确保所有依赖的模块都已正确安装。如果还无法解决问题,可以考虑在PyTorch官方论坛上搜索类似的问题,或者向其提问。

    评论
  • dahe0825 2023-03-20 13:26
    关注

    参考GPT和自己的思路,这个错误是由于权重文件中存储的模型类名与你的当前代码中的模型类名不匹配而导致的。具体地说,当你在权重文件中保存了一个名为'yolo_pruned'的模型类,而当前代码中却没有定义这个类时,就会出现这个错误。

    为了解决这个问题,你可以检查一下你的代码和权重文件中的模型类名是否匹配。如果它们不匹配,你需要修改代码,使它们匹配。另外,你还可以尝试使用'import_module'函数动态地加载模块来解决这个问题。具体来说,你可以使用以下代码行来尝试加载模型类:

    import importlib
    model_module = importlib.import_module('yolo_pruned')
    model_class = getattr(model_module, 'YourModelClassName')
    

    其中,'yolo_pruned'是你的模型类所在的模块名,'YourModelClassName'是你的模型类名。你需要将这两个值替换为你实际使用的值。

    评论
  • simple_chenc 2023-03-20 13:26
    关注

    通常这种情况就是你的安装包没有安装完整的原因,或者你的安装包没有正确安装到当前的环境

    评论
  • MarkHan_ 2023-03-20 13:32
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    根据您提供的信息,问题可能在于您的代码中尝试加载一个名为 yolo_pruned 的模块,但系统找不到这个模块。请确保您已正确地设置了模块的搜索路径,并且该路径包含名为 yolo_pruned 的模块。您还可以尝试通过在代码中打印模块搜索路径来调试此问题,如下所示:

    import sys
    print(sys.path)
    
    

    如果您确定模块的搜索路径已正确设置,并且仍然无法找到该模块,您可以尝试将该模块的源代码复制到您的项目中,并将其作为常规的 Python 模块导入。这样做可能需要一些手动配置,以确保所有依赖项都正确加载和安装。

    评论
  • 「已注销」 2023-03-20 13:45
    关注

    参考GPT和自己的思路:根据你提供的代码和错误信息来看,可能问题出在尝试加载 yolo_pruned 模块时出错了,导致找不到对应的类。这可能与剪枝过程中生成的模型结构有关。

    你可以检查一下 DetectPrunedMultiBackend 类中的代码,看看是否有任何地方引用了 yolo_pruned 模块,或者检查一下 attempt_load_pruned 函数中的代码,看看是否正确地设置了模型结构。

    另外,你可以尝试在模型导入之前手动加载 yolo_pruned 模块,看看是否有帮助,比如:

    import yolo_pruned
    model = DetectPrunedMultiBackend(weights, device=device, dnn=dnn)
    model = attempt_load_pruned(weights if isinstance(weights, list) else w, map_location='cpu')
    ckpt = torch.load(attempt_download(w), map_location=map_location)
    
    
    

    如果问题仍然存在,你可以尝试重新安装 yolov5 或者使用其他版本的 yolov5,看看是否有助于解决问题。

    评论
  • weixin_52523720 2023-03-20 14:18
    关注

    根据您提供的代码和错误信息,可以看出问题出在尝试加载已剪枝权重的代码段中。具体地说,错误信息中指出在序列化模块时找不到名为"yolo_pruned"的模块。这表明在导入权重时可能需要加载一个名为"yolo_pruned"的模块,但该模块当前不可用。

    要解决此问题,您可以检查一下以下几个方面:

    检查您的代码和文件结构是否与用于训练原始模型和剪枝的代码和文件结构相同。

    确保在剪枝模型时使用了相同版本的YOLOv5代码库和依赖项。

    检查您是否正确地保存了已剪枝的权重。您可以使用netron等工具来检查权重文件是否可用,确保已保存正确的权重。

    检查您的代码中是否存在导入名为"yolo_pruned"的模块。如果是这样,请确保该模块可以正确地导入,并且已安装所需的依赖项。如果不存在该模块,请查找您导入模型时所使用的模块,并确保它与模型训练和剪枝时使用的模块相同。

    评论
  • ℡(子轩) 2023-03-20 15:35
    关注

    根据您提供的代码和错误信息,可以看出该错误是由于在加载模型权重时,无法找到名为'yolo_pruned'的模块。这可能是由于您导入模型时使用了不正确的模块名称或路径导致的。

    建议您检查一下模型的导入路径和模块名称是否正确,并确认模型文件是否被正确地保存和加载。此外,您还可以尝试使用Python的traceback模块来获取更详细的错误信息,以确定问题的确切位置。

    另外,您还可以查看一下权重文件中的信息,例如权重文件是否损坏或不完整。如果权重文件存在问题,您可能需要重新训练模型或尝试使用其他可用的权重文件。

    如果您无法解决该问题,请提供更多关于您的代码和环境的信息,以便我们更好地帮助您解决问题。

    评论
  • deel123 2023-03-22 00:17
    关注

    好的,谢谢,我自己再去尝试一下

    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 求一个智能家居控制的代码
  • ¥15 ad软件 pcb布线pcb规则约束编辑器where the object matpcb布线pcb规则约束编辑器where the object matchs怎么没有+15v只有no net
  • ¥15 虚拟机vmnet8 nat模式可以ping通主机,主机也能ping通虚拟机,但是vmnet8一直未识别怎么解决,其次诊断结果就是默认网关不可用
  • ¥20 求各位能用我能理解的话回答超级简单的一些问题
  • ¥15 yolov5双目识别输出坐标代码报错
  • ¥15 这个代码有什么语法错误
  • ¥15 给予STM32按键中断与串口通信
  • ¥15 使用QT实现can通信
  • ¥15 关于sp验证的一些东西,求告知如何解决,
  • ¥35 关于#javascript#的问题:但是我写的只能接码数字和字符,帮我写一个解码JS问题