Python ValueError:没有足够的值在Pytorch中解包(预期为3,得到2)

Python ValueError:没有足够的值在Pytorch中解包(预期为3,得到2),python,deep-learning,pytorch,Python,Deep Learning,Pytorch,这是我的定义验证函数 当我加载模型并使用这段代码开始预测时,我使用PyTorch收到了错误。在这之后,我通过epoch循环和batch循环进行迭代,我得到了这个错误 def validate_epoch(net, val_loader,loss_type='CE'): net.train(False) running_loss = 0.0 sm = nn.Softmax(dim=1) truth = [] preds = [] bar = tqd

这是我的定义验证函数
当我加载模型并使用这段代码开始预测时,我使用PyTorch收到了错误。在这之后,我通过epoch循环和batch循环进行迭代,我得到了这个错误

def validate_epoch(net, val_loader,loss_type='CE'):
    net.train(False)
    running_loss = 0.0
    sm = nn.Softmax(dim=1)

    truth = []
    preds = []
    bar = tqdm(total=len(val_loader), desc='Processing', ncols=90)
    names_all = []
    n_batches = len(val_loader)
    for i, (batch, targets, names) in enumerate(val_loader):
        if loss_type == 'CE':
                labels = Variable(targets.float())
                inputs = Variable(batch)
        elif loss_type == 'MSE':
                labels = Variable(targets.float())
                inputs = Variable(batch)

        outputs = net(inputs)
        labels = labels.long()
        loss = criterion(outputs, labels)
        if loss_type =='CE':
            probs = sm(outputs).data.cpu().numpy()
        elif loss_type =='MSE':
            probs = outputs
            probs[probs < 0] = 0
            probs[probs > 4] = 4
            probs = probs.view(1,-1).squeeze(0).round().data.cpu().numpy()
        preds.append(probs)
        truth.append(targets.cpu().numpy())
        names_all.extend(names)
        running_loss += loss.item()
        bar.update(1)
        gc.collect()
    gc.collect()
    bar.close()
    if loss_type =='CE':
        preds = np.vstack(preds)
    else:
        preds = np.hstack(preds)
    truth = np.hstack(truth)
    return running_loss / n_batches, preds, truth, names_all
正如您在回溯错误中看到的,它给出了一些终端显示错误:

ValueError                                Traceback (most recent call last)
<ipython-input-27-d2b4a1ca3852> in <module>
     12 test_started = time.time()
     13 
---> 14 test_loss, probs, truth, file_names = validate_epoch(model, test_iterator)
     15 preds = probs.argmax(1)
     16 

<ipython-input-25-34e29e0ff6ed> in validate_epoch(net, val_loader, loss_type)
      9     names_all = []
     10     n_batches = len(val_loader)
---> 11     for i, (batch, targets, names) in enumerate(val_loader):
     12         if loss_type == 'CE':
     13                 labels = Variable(targets.float())

ValueError: not enough values to unpack (expected 3, got 2)
ValueError回溯(最近一次调用)
在里面
12测试_开始=时间。时间()
13
--->14测试丢失、问题、真相、文件名=验证历元(模型、测试迭代器)
15 preds=问题argmax(1)
16
在有效期内(净值、增值加载器、损失类型)
9个名称_all=[]
10个n_批次=长度(val_装载机)
--->11对于枚举(val_loader)中的i(批次、目标、名称):
12如果损失类型=‘CE’:
13标签=变量(targets.float())
ValueError:没有足够的值来解包(预期为3,实际为2)
来自:

返回:(示例,目标),其中目标是目标类的类索引

因此,非常简单,您当前使用的dataset对象返回一个包含2个项的元组。如果试图将此元组存储在3个变量中,则会出现错误。正确的路线是:

for i, (batch, targets) in enumerate(val_loader):

如果您确实需要名称(我假设是每个图像的文件路径),您可以定义一个新的dataset对象,该对象继承自
ImageFolder
dataset,并重载
\uu getitem\uuuuuu
函数以同时返回此信息。

问题在于dataloader或底层dataset类。您需要3个输出,即
批处理
目标
名称
。但是,从错误来看,dataloader似乎只提供了两件事(我猜是批处理和目标)。因此,请检查代码的这一部分(如果没有发现问题,请将其添加到问题中)。请注意,错误之后出现的任何代码都与问题无关(从未执行),不应包含在此处,因为它只会造成不必要的混乱;对于不相关的代码,如
print
语句(已编辑掉),也是如此。这里发布的代码应该是最小的。为了帮助我们,我们需要查看定义了val\u loader的代码。numerate给出了一个索引和一个值(在迭代器上),这没有问题,然后您尝试解包,这样您的测试迭代器就会生成一对,不是三元组。以下testpath=“/home/testdata/”#创建验证数据集test_data=datasets.ImageFolder(root=testpath,transform=test_transforms)打印(test_data)BATCH_SIZE=32 test_iterator=torch.utils.data.DataLoader(test_data,BATCH_SIZE=BATCH_SIZE)打印(f'测试示例数:{len(test_iterator)}')@DerekG
for i, (batch, targets) in enumerate(val_loader):