ValueError: too many values to unpack (expected 2)

起因

最近在做一门专业课的作业,关于交通灯图像分类,我选择了把数据集按(9:1)分为了(训练集:验证集),并生成了标签,标签格式路径 label,在每次训练完一个epoch后进行验证集的验证,输出准确率

def test():
    print('begin test')
    model.eval()
    total_correct = 0
    val_iter = iter(val_dataloader)
    max_iter = len(val_dataloader)
    for iteration in range(max_iter):
        try:
            images, labels = next(val_iter)
            #print('images, labels')
        except:
            continue

        if torch.cuda.is_available():
            images, labels = images.cuda(), labels.cuda()
            out = model(images)
            prediction = torch.max(out, 1)[1]
            correct = (prediction == labels).sum()
            total_correct += correct
            #print(type(correct), type(total_correct))
            print('Iteration: {}/{}'.format(iteration, max_iter), 'ACC: %.3f' %(correct.float()/batch_size))
    print('All ACC: %.3f'%(total_correct.float()/(len(val_dataloader)* batch_size)))

发现训练时print('All ACC: %.3f'%(total_correct.float()/(len(val_dataloader)* batch_size)))输出会报错
是一个关于数据格式的错误,AttributeError: 'int' object has no attribute 'float'

经过

经过查找错误,最终将错误定位在images, labels = next(val_iter)这行语句,因为在这里异常处理机制try的内容没有执行,直接执行了continue,导致total_correct恒为0
把异常处理机制删去,执行images, labels = next(val_iter)便出现了如下错误:

ValueError: too many values to unpack (expected 2)

可迭代的对象(可以用for循环的对象)Iterable 一类:list,tuple,dict,set,str;
二类:generator(都是Iterator对象),包含生成器和带yield的generatoe function。
我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使⽤next()函数来获取下⼀条数据。iter()函数实际上就是调⽤了可迭代对象的 __iter__ ⽅法。

如:

val_iter = iter(val_dataloader)
images, labels = next(val_iter)

结果

images, labels = next(val_iter)中发生了ValueError: too many values to unpack (expected 2)
是因为我的标签信息路径中存在空格,导致读取信息时出错
把文件夹名称的空格删去,重新生成标签信息就可以训练啦

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐