ValueError: not enough values to unpack (expected 2, got 0)

img

Traceback (most recent call last):
  File "train.py", line 537, in <module>
    train(hyp, opt, device, tb_writer, wandb)
  File "train.py", line 181, in train
    dataloader, dataset = create_dataloader(train_path, imgsz, batch_size, gs, opt,
  File "/hy-tmp/manguo/utils/datasets.py", line 64, in create_dataloader
    dataset = LoadImagesAndLabels(path, imgsz, batch_size,
  File "/hy-tmp/manguo/utils/datasets.py", line 402, in __init__
    labels, shapes = zip(*cache.values())
ValueError: not enough values to unpack (expected 2, got 0)

感觉问题和http://t.csdn.cn/MBJfe很像,逻辑上是我需要读取名为labels.cache缓存文件的内容,缓存文件的作用是为了更好的训练但是这个文件需要训练好以后才能获得,所以给我的感觉就是卡死了。
我自己的初步想法是不去读取那个文件,因为我没有,但是我不知道改修改哪里,这边我用的是yolov4的模型。

虽然报错看着跟labels.caches文件有关系,但是可能问题出在labels的生成代码上,大概率是生成labels的代码的里面路径出了问题,如果以前训练成功过,这边建议可以比较一下以前成功的生成文件,比较一下区别,望采纳!

引用GPT:这个错误通常表示一个函数期望接收的参数数量与实际参数数量不匹配。在这个具体的错误信息中,程序在第64行中的zip函数期望接收两个以上的参数,但是cache.values()返回的结果可能为空,导致无法提供足够的参数。

为了解决这个问题,可以在代码中添加一些调试信息来查看缓存的值是否为空。此外,还可以检查cache字典的数据结构是否正确,并确保可以从中正确解析出labels和shapes。
为了添加调试信息来查看缓存的值是否为空,可以在相关代码行附近添加print语句。例如,在datasets.py文件中,可以在__init__方法中添加以下语句来检查cache字典的数据结构:

print(f"Cache length: {len(cache)}")
print(f"Cache contents: {cache}")


这将打印缓存的长度和内容。如果缓存为空,这些语句将有助于确定问题所在。

具体来说,在create_dataloader函数中,可以在以下位置添加这些语句:

def create_dataloader(path, imgsz, batch_size, gs, opt,
                       hyp=None, augment=False, cache=False, pad=0.0, rect=False,
                       rank=-1, world_size=1, workers=8, image_weights=False,
                       quad=False, prefix=''):
    ...
    dataset = LoadImagesAndLabels(path, imgsz, batch_size,
                                  augment=augment,
                                  hyp=hyp,  # augmentation hyperparameters
                                  rect=rect,  # rectangular training
                                  cache_images=cache,
                                  single_cls=single_cls,
                                  pad=pad,
                                  rank=rank,
                                  world_size=world_size,
                                  image_weights=image_weights,
                                  quad=quad,
                                  prefix=prefix)
    ...

在LoadImagesAndLabels类的__init__方法中,可以在以下位置添加这些语句:

class LoadImagesAndLabels(Dataset):    
    def __init__(self, path, img_size=(640, 640), batch_size=16, augment=False,
                 hyp=None,  # augmentation hyperparameters
                 rect=False,  # rectangular training
                 cache_images=False,
                 single_cls=False,
                 pad=0.0,
                 rank=-1,
                 world_size=1,
                 image_weights=False,
                 quad=False,
                 prefix=''):
        ...
        labels, shapes = zip(*cache.values())
        print(f"Cache length: {len(cache)}")
        print(f"Cache contents: {cache}")
        ...


这将打印缓存的长度和内容。如果cache字典为空,这些语句将有助于确定问题所在。

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:
  • 这个错误通常是由于给定的参数数量不足引起的。根据你提供的信息,发生错误的位置在 datasets.py 文件的第 402 行。这里的代码尝试从 cache 字典中获取值,并使用 zip() 函数将其拆分成标签和形状两个列表,但出现了问题。
  • 可能原因之一是你没有正确地设置输入参数,比如 train_pathimgsz 等。你可以检查一下这些变量是否被正确初始化或传递给函数。

另一个可能的原因是数据集中的某些图像或标签文件缺失或格式不正确,导致无法读取它们。你可以检查数据集文件夹中的文件是否完整并且符合标准格式。

最后,你也可以尝试在代码中添加一些调试语句来帮助你定位错误,比如打印一些变量的值,以便更好地理解程序的执行过程。

这个错误通常是由于尝试解包一个空的序列或元组而引起的。在这个特定的情况下,代码期望从一个包含两个值的序列中解包值,但实际上序列是空的,因此无法解包。
在这个错误的上下文中,可能是在train.py文件的第537行中的train函数中出现了问题。可能是在函数中的某个地方,代码期望从一个包含两个值的序列中解包值,但实际上序列是空的,因此无法解包。
要解决这个问题,需要检查代码中的train函数,并找出哪个部分尝试解包一个空的序列。一旦找到了问题所在,就可以采取适当的措施来避免出现这个错误。可能需要添加一些条件语句来确保序列不为空,或者在代码中添加一些错误处理逻辑来处理这种情况。

你需要看看cache变量是怎么设置值的,你不把对应代码放上来,没人知道该怎么修改。

该回答引用ChatGPT
您好,根据错误提示信息 ValueError: not enough values to unpack (expected 2, got 0),我们可以看出程序在执行 zip(*cache.values()) 时出现了问题,因为 cache.values() 返回的是一个空列表
这个错误可能是由于训练数据集的路径或标签文件路径设置不正确,或者标签文件格式不正确导致的。根据您的描述,似乎是由于标签缓存文件 labels.cache 不存在或为空导致的。
您可以尝试以下解决方案:

检查标签文件的路径是否正确,并确保标签文件中包含正确的标注信息。

如果标签缓存文件确实不存在,则可以尝试训练模型时不使用缓存文件,在 datasets.py 中将 cache_images cache_labels 变量设置为 False。

如果标签缓存文件存在但为空,则可以尝试重新生成标签缓存文件,方法是在 datasets.py 中将 cache_images cache_labels 变量设置为 True,然后重新运行训练脚本,让程序重新生成标签缓存文件。
希望这些解决方案能够帮助您解决问题。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个错误通常是由于期望将一个长度为2的元组解包为变量,但实际上元组的长度为0导致的。根据你的问题描述,问题可能是由于在缓存文件中没有数据而导致的。

建议你检查一下是否存在 labels.cache 文件,如果不存在,则需要重新运行你的训练代码来生成该文件。另外,你可以尝试删除该文件并重新运行代码,以便生成新的缓存文件。

如果仍然无法解决问题,你应该仔细检查代码中创建数据集和数据加载程序的部分,并确保在创建数据集时使用的文件路径是正确的。如果有必要,你可以检查你的代码库或模型的文档,以查找关于如何生成缓存文件的更多信息。

另外,你可以在发布问题时提供更多的代码细节和上下文信息,以更好地帮助人们诊断问题,并提供更有针对性的解决方案。
如果我的回答解决了您的问题,请采纳!

这个错误通常是因为程序试图从一个长度为零的序列中提取元素。在这个特定的情况下,出现了此错误,是因为您试图从空的 cache 字典中提取值,而此时 labels 和 shapes 应该都包含有值。这可能是由于您提供的 path 不正确或者 cache 中的数据被删除或移动导致的。

为了解决此问题,您可以尝试检查您的代码,确保 path 正确并且 cache 中的数据可用。您还可以在代码中添加一些调试输出,以帮助确定问题所在的具体位置。另外,如果您仍然无法解决问题,请尝试重新运行程序,看看问题是否会消失。