- mySSL - Failed after 0:00:16! Traceback (most recent calls WITHOUT Sacred inte...

2025年09月30日 14:59 响应: 17.70秒 状态: success

🚨 错误信息

ERROR - mySSL - Failed after 0:00:16! Traceback (most recent calls WITHOUT Sacred internals): File "training.py", line 146, in main for _, sample_batched in enumerate(trainloader): File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 345, in __next__ data = self._next_data() File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 856, in _next_data return self._process_data(data) File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 881, in _process_data data.reraise() File "/root/miniconda3/lib/python3.8/site-packages/torch/_utils.py", line 395, in reraise raise self.exc_type(msg) RuntimeError: Caught RuntimeError in DataLoader worker process 0. Original Traceback (most recent call last): File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/_utils/worker.py", line 178, in _worker_loop data = fetcher.fetch(index) File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 44, in fetch data = [self.dataset[idx] for idx in possibly_batched_index] File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 44, in <listcomp> data = [self.dataset[idx] for idx in possibly_batched_index] File "/root/autodl-tmp/DSPNet-main/dataloaders/GenericSuperDatasetv2.py", line 313, in __getitem__ label_t = self.supcls_pick_binarize(new_label, sup_max_cls) # 使用过滤后的标签 File "/root/autodl-tmp/DSPNet-main/dataloaders/GenericSuperDatasetv2.py", line 256, in supcls_pick_binarize bi_val = int(torch.randint(low = 1, high = int(sup_max_cls), size = (1,))) RuntimeError: random_ expects 'from' to be less than 'to', but got from=1 >= to=1

🤖 AI解决方案

ERROR - mySSL - Failed after 0:00:16!
Traceback (most recent calls WITHOUT Sacred internals):
  File "training.py", line 146, in main
    for _, sample_batched in enumerate(trainloader):
  File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 345, in __next__
    data = self._next_data()
  File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 856, in _next_data
    return self._process_data(data)
  File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 881, in _process_data
    data.reraise()
  File "/root/torch/_utils.py", line 395, in reraise
    raise self.exc_type(msg)
RuntimeError: Caught RuntimeError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/_utils/worker.py", line 178, in _worker_loop
    data = fetcher.fetch(index)
  File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 44, in fetch
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/root/miniconda3/lib/python3.8/site-applications/torch/utils/data/_utils/fetch.py", line 44, in <listcomp>
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/root/autodl-tmp/DSPNet-main/dataloaders/GenericSuperDatasetv2.py", line 313, in __getitem__
    label_t = self.supcls_pick_binarize(new_label, sup_max_cls)  # 使用过滤后的标签
  File "/root/autodl-tmp/DSPNet-main/dataloaders/GenericSuperDatasetv2.py", line 256, in supcls_pick_binarize
    bi_val = int(torch.randint(low = 1, high = int(sup_max_cls), size = (1,)))
RuntimeError: random_ expects 'from' to be less than 'to', but got from=1 >= to=1

错误翻译

核心关键句RuntimeError: random_ expects 'from' to be less than 'to', but got from=1 >= to=1 中文翻译RuntimeError: random_ 期望 'from' 小于 'to',但得到 from=1 >= to=1

原因分析

torch.randint(low=1, high=int(sup_max_cls), size=(1,)) 中的 high 参数值等于 low 参数值(均为1),导致 torch.randint 无法生成随机数。

解决方案

修改 supcls_pick_binarize 函数中生成随机数的逻辑,确保 high 值始终大于 low 值。一种简单的方法是当 sup_max_cls 为1时,特殊处理,例如直接返回0或1,或者将 high 值至少设为2。

示例修改(假设当 sup_max_cls 为1时,应选择类别0):

# 在 GenericSuperDatasetv2.py 的 supcls_pick_binarize 函数中
# 找到这行:
# bi_val = int(torch.randint(low = 1, high = int(sup_max_cls), size = (1,)))

# 修改为:
if int(sup_max_cls) <= 1:
    bi_val = 0 # 或者其他合适的默认值,取决于你的业务逻辑
else:
    bi_val = int(torch.randint(low = 1, high = int(sup_max_cls), size = (1,)))

或者,如果sup_max_cls代表类别的数量,且至少需要一个类别:
# 在 GenericSuperDatasetv2.py 的 supcls_pick_binarize 函数中
# 找到这行:
# bi_val = int(torch.randint(low = 1, high = int(sup_max_cls), size = (1,)))

# 修改为:
if int(sup_max_cls) < 2:
    # 如果最大类别数小于2,则无法生成1到sup_max_cls之间的随机数
    # 这里可以根据需求调整,例如设置为0,或者抛出更明确的错误
    bi_val = 0
else:
    bi_val = int(torch.randint(low=1, high=int(sup_max_cls), size=(1,)))

预防措施

  • 在调用可能产生边界问题的函数(如 torch.randint)前,对输入参数进行校验,确保其符合函数的约束条件。
  • 在数据加载或预处理阶段,增加对类别数量等关键参数的检查,防止出现不符合预期的值。