You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch训练CIFAR10时‘too many values to unpack’错误修复求助

修复PyTorch训练CIFAR10时的ValueError: too many values to unpack (expected 2)

错误原因

报错出现在ImageClassificationBase.training_step方法的images, labels = batch行,本质是当前DataLoader返回的batch仅包含图像数据,没有对应标签,无法拆分为两个变量。根源是你直接对单独的图像数组X_test使用random_split,未将图像与标签y_test绑定为完整数据集。


修复步骤

1. 将图像与标签打包为PyTorch Dataset

PyTorch的random_split需要作用在包含输入数据和标签的完整数据集上,先把numpy数组转为张量并打包:

import torch
from torch.utils.data import TensorDataset, random_split

# 转换numpy数组为PyTorch张量,同时调整维度为[batch, channels, height, width](符合PyTorch模型输入要求)
X_test_tensor = torch.tensor(X_test).permute(0, 3, 1, 2)
y_test_tensor = torch.tensor(y_test)

# 打包图像与标签为完整数据集
full_test_ds = TensorDataset(X_test_tensor, y_test_tensor)

# 划分训练集与验证集
val_size = 3000
train_size = len(full_test_ds) - val_size
train_ds, val_ds = random_split(full_test_ds, [train_size, val_size])

2. 保留原有DataLoader代码(无需修改)

现在train_ds和val_ds都包含图像与标签,DataLoader会返回(images, labels)元组,可正常解包:

batch_size=16
train_dl = DataLoader(train_ds, batch_size, shuffle=True, num_workers=4, pin_memory=True)
val_dl = DataLoader(val_ds, batch_size, num_workers=4, pin_memory=True)

3. 补全模型定义的缺失部分

你的Cifar10CnnModel类__init__方法为空,未定义self.network,后续会触发新错误,以下是一个基础CNN示例:

class Cifar10CnnModel(ImageClassificationBase):
    def __init__(self):
        super().__init__()
        self.network = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2, 2),

            nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2, 2),

            nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2, 2),

            nn.Flatten(), 
            nn.Linear(256*4*4, 1024),
            nn.ReLU(),
            nn.Linear(1024, 512),
            nn.ReLU(),
            nn.Linear(512, 10)
        )
    
    def forward(self, xb):
        return self.network(xb)

同时确保accuracy函数已定义:

def accuracy(outputs, labels):
    _, preds = torch.max(outputs, dim=1)
    return torch.tensor(torch.sum(preds == labels).item() / len(preds))

4. 实例化模型并训练

现在可以正常执行训练:

model = Cifar10CnnModel()
history = fit(model, train_dl, val_dl)

内容的提问来源于stack exchange,提问作者khatooon khedri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:55:18