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)
是因为我的标签信息路径中存在空格,导致读取信息时出错
把文件夹名称的空格删去,重新生成标签信息就可以训练啦