运行代码报错如下:

/home/xujianxia/anaconda3/bin/conda run -n monai --no-capture-output python /data/xujianxia/LDFC-main/detection/train.py 

Traceback (most recent call last):

  File "/data/xujianxia/LDFC-main/detection/train.py", line 12, in <module>

    from train_utils import train_eval_utils as train_util

  File "/data/xujianxia/LDFC-main/detection/train_utils/__init__.py", line 2, in <module>

    from .coco_eval import CocoEvaluator

  File "/data/xujianxia/LDFC-main/detection/train_utils/coco_eval.py", line 7, in <module>

    import torch._six

ModuleNotFoundError: No module named 'torch._six'

ERROR conda.cli.main_run:execute(127): `conda run python /data/xujianxia/LDFC-main/detection/train.py` failed. (See above for error)

这个报错的核心原因是:你当前环境中安装的 PyTorch 版本太新了,而你运行的代码 (LDFC-main) 比较旧,它依赖一个在新版 PyTorch 中已经被移除的模块 torch._six

这是一个典型的代码与库版本不兼容的问题。


错误原因分析 🧐

  1. 报错信息ModuleNotFoundError: No module named 'torch._six'

    • 这明确指出,在 PyTorch 库 (torch) 中找不到一个名为 _six 的内部模块。
  2. torch._six 是什么?

    • _six 模块是 PyTorch 早期版本中内置的一个工具,它的作用类似于一个非常流行的第三方库 six
    • 它的主要功能是提供兼容性,帮助代码能同时在 Python 2 和 Python 3 环境下运行。例如,它提供了一些方法来处理在两个 Python 版本中不一样的字符串类型或数据结构。
  3. 为什么会找不到它?

    • 随着 Python 2 在 2020 年停止官方支持,绝大多数库都放弃了对 Python 2 的兼容。
    • PyTorch 在较新的版本中(大约从 v1.10 开始)为了精简代码和移除历史包袱,彻底删除了 torch._six 这个兼容性模块
    • 因此,当你的旧代码 coco_eval.py 尝试 import torch._six 时,在新版的 PyTorch 里自然就找不到了。

解决方案 ✅

方案一:降级 PyTorch 版本

这是最直接、最简单的解决方法。既然代码是为旧版 PyTorch 编写的,那么我们就把环境中的 PyTorch 降级到一个兼容的旧版本。通常,PyTorch 1.9 或 1.8 等版本是比较安全的选择。

操作步骤:

  1. 激活你的 conda 环境

    conda activate monai
    
  2. 完全卸载当前的 PyTorch

    pip uninstall torch torchvision torchaudio
    
  3. 安装一个兼容的旧版本
    你需要根据你服务器的 CUDA 版本来选择正确的安装命令。你可以通过 nvidia-smi 命令查看 CUDA 版本。

    • 示例: 假如你的 CUDA 版本是 11.1,你可以安装 PyTorch 1.9.0:

      pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
      
    • 示例: 假如你的 CUDA 版本是 10.2,你可以安装 PyTorch 1.9.0:

      pip install torch==1.9.0+cu102 torchvision==0.10.0+cu102 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
      

    注意:你可以在 PyTorch 官网的历史版本页面 找到适合你 CUDA 环境的精确安装命令。

方案二:修改源代码

好的,没有问题。既然您不想修改PyTorch版本,我们来通过修改源代码的方式解决这个问题。

这个方案是完全可行的,因为 torch._six 的作用只是为了兼容旧版的 Python 2,而在您当前只使用 Python 3 的环境下,这些兼容代码完全可以被标准的 Python 3 写法替代。

请按照以下步骤操作:

第一步:定位并打开文件

首先,您需要打开报错信息中提到的那个文件。文件路径是:
/data/xujianxia/LDFC-main/detection/train_utils/coco_eval.py

第二步:删除或注释掉错误的导入语句

coco_eval.py 文件中,找到第 7 行左右的这句代码:

import torch._six

将这一行直接删除,或者在行首加上 # 将它注释掉,像这样:

# import torch._six
第三步:替换文件中已失效的代码

删除了导入语句后,程序还无法运行,因为文件中的其他地方还在使用 torch._six。我们需要找到这些地方并用现代 Python 3 的语法替换它。

在这个 coco_eval.py 文件中,最常见的用法是 torch._six.string_classes,它被用来判断一个变量是否是字符串类型。

  1. 在文件中搜索关键词
    torch._six.string_classes

  2. 将其替换为
    str

举例说明,您很可能会在文件中看到类似这样的代码:

# -------------------
# 修改前 (Before modification):
# -------------------
if isinstance(key, torch._six.string_classes):
    # ... do something

您需要把它修改为:

# -------------------
# 修改后 (After modification):
# -------------------
if isinstance(key, str):
    # ... do something

这里的 str 就是 Python 3 中标准的字符串类型,完全可以替代原来复杂的兼容性写法。

第四步:检查其他可能的用法

为了确保万无一失,请在 coco_eval.py 文件中再搜索一下 torch._six 这个关键词,看看除了 string_classes 之外是否还有其他用法。另一种可能的用法是 torch._six.integer_classes

  • 如果找到 torch._six.integer_classes,请将其替换为 int

总结与操作清单

  1. ✅ 打开 /data/xujianxia/LDFC-main/detection/train_utils/coco_eval.py 文件。
  2. ✅ 删除或注释掉 import torch._six 这一行。
  3. ✅ 在整个文件中,查找所有的 torch._six.string_classes 并全部替换为 str
  4. ✅ 保存文件。

完成这些修改后,torch._six 相关的兼容性代码就被完全移除了,您的程序应该就能在不降级 PyTorch 的情况下正常运行了。请再次尝试运行您的训练脚本。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐