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
相关产品推荐
相关产品推荐

