- mySSL - Failed after 0:00:16! Traceback (most recent calls WITHOUT Sacred inte...
🚨 错误信息
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)前,对输入参数进行校验,确保其符合函数的约束条件。 - 在数据加载或预处理阶段,增加对类别数量等关键参数的检查,防止出现不符合预期的值。