解决Dataloader报错:ValueError: too many values to unpack (expected 2)

在使用Python进行FPGA开发的计算机视觉项目中,遇到Dataloader报错:ValueError: too many values to unpack (expected 2)。错误出现在尝试解包数据时,原本的代码返回了多个值,但预期只有2个。通过修改MyDataset类的返回值,将数据集与标签组合,并使用DataLoader处理,避免了直接堆叠TensorDataset导致的问题。解决方案是移除TensorDataset和相应代码,直接使用DataLoader加载处理后的数据集,解决了报错问题。
部署运行你感兴趣的模型镜像

原始代码:

# 构建一个能够加载数据集的类
class MyDataset(Dataset):  # 继承Dataset
    # 得到一个包含图像和标签的列表
    def __init__(self, root, label_root,transform=None,is_aug=None,fix_size=(244, 244)):  # 初始化一些属性
        data_list = get_data(root)  # 得到数据的名字列表
        label = get_label(label_root)
        self.data_list = data_list
        self.label = label
        self.transform = transform
        self.is_aug = is_aug
        self.fix_size = fix_size

    def __len__(self):
        return len(self.data_list)

    # 翻转
    def img_flip(self, img, axi):  # axi=0:上下翻转 axi=1:左右翻转
        img = np.flip(img, axis=axi).copy()
        return img

    # 旋转
    def img_rotate(self, img):
        angle = random.randint(0, 360)
        h, w = img.shape[:2]
        M = cv2.getRotationMatrix2D((h / 2, w / 2), angle, 1)
        img = cv2.warpAffine(img, M, (h, w))
        return img

    # 得到每个元素的图像像素矩阵和标签
    def __getitem__(self,index):
        x_idx = self.data_list[index]   # 获取图像的索引
        img = cv2.imread(x_idx, 1)  # 加载图像
        # 把image设为固定尺寸
        img = cv2.resize(img, dsize=self.fix_size)
        label = self.label[index]

        # 数据增强(翻转,旋转)
        if self.is_aug:
            p_f = torch.rand(1)
            if p_f > 0.2:  # 翻转
                axi = random.choice([0, 1])  # axi=0:上下翻转 axi=1:左右翻转
                img = self.img_flip(img, axi)
            p_ro = torch.rand(1)
            if p_ro > 0.5:  # 旋转
                img = self.img_rotate(img)
        # 数据变换
        img = self.transform(img)
        return img, label

# 数据batch处理
def processing(train_root,train_label_root, test_root,test_label_root, bs):
    train_sets,label_train = MyDataset(train_root,train_label_root,
                           transform=transforms.Compose([transforms.ToPILImage(),
                                                                     transforms.Resize((244, 244)),
                                                                     transforms.ToTensor()]),
                           is_aug=True
                           )
    train_dataset = TensorDataset(train_sets,label_train)
    train_loaders = DataLoader(train_dataset, batch_size=bs, shuffle=True)  # shuffle = true就是要洗牌随机取,而不是按顺序取。
    # 验证集不需要做数据增强,但要保证图像大小一致
    test_sets,label_test = MyDataset(test_root,test_label_root,
                          transform=transforms.Compose([transforms.ToPILImage(),
                                                        transforms.Resize((244, 244)), transforms.ToTensor()]),
                          is_aug = False
                          )
    test_dataset = TensorDataset(test_sets,label_test)
    test_loaders = DataLoader(test_dataset, batch_size=bs, shuffle=True)
    return train_loaders, test_loaders

##报错,ValueError: too many values to unpack (expected 2)
##报错行 is_aug=True,运行三次,能够出来三个结果(print train_path和label),但是第四个就print不出来了
##错误原因,虽然上面是return img,label,但是使用dataloader是返回一个迭代器,可以将数据图像和label堆在一起,后面train的时候才一代一代地对应取出来
##更改: train_sets = MyDataset(train_root,train_label_root,
                           transform=transforms.Compose([transforms.ToPILImage(),
                                                                     transforms.Resize((244, 244)),
                                                                     transforms.ToTensor()]),is_aug=True)
    去掉train_dataset = TensorDataset(train_sets,label_train)
    还有train_loaders = DataLoader(train_sets, batch_size=bs, shuffle=True)

不会报错。

【记第一次写文章】

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值