{"record":{"id":"613209bb358947b1","repo":"WZMIAOMIAO/deep-learning-for-image-processing","slug":"dataset-have-classes-but-input-613209","errorCode":null,"errorMessage":"dataset have {} classes, but input {}","messagePattern":"dataset have (.+?) classes, but input (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"pytorch_classification/mini_imagenet/train_single_gpu.py","lineNumber":45,"sourceCode":"                                     transforms.RandomHorizontalFlip(),\n                                     transforms.ToTensor(),\n                                     transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),\n        \"val\": transforms.Compose([transforms.Resize(256),\n                                   transforms.CenterCrop(224),\n                                   transforms.ToTensor(),\n                                   transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])}\n\n    data_root = args.data_path\n    json_path = \"./classes_name.json\"\n    # 实例化训练数据集\n    train_dataset = MyDataSet(root_dir=data_root,\n                              csv_name=\"new_train.csv\",\n                              json_path=json_path,\n                              transform=data_transform[\"train\"])\n\n    # check num_classes\n    if args.num_classes != len(train_dataset.labels):\n        raise ValueError(\"dataset have {} classes, but input {}\".format(len(train_dataset.labels),\n                                                                        args.num_classes))\n\n    # 实例化验证数据集\n    val_dataset = MyDataSet(root_dir=data_root,\n                            csv_name=\"new_val.csv\",\n                            json_path=json_path,\n                            transform=data_transform[\"val\"])\n\n    batch_size = args.batch_size\n    nw = min([os.cpu_count(), batch_size if batch_size > 1 else 0, 8])  # number of workers\n    print('Using {} dataloader workers every process'.format(nw))\n    train_loader = torch.utils.data.DataLoader(train_dataset,\n                                               batch_size=batch_size,\n                                               shuffle=True,\n                                               pin_memory=True,\n                                               num_workers=nw,\n                                               collate_fn=train_dataset.collate_fn)\n","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/blob/1ec3fe6f374fc9969973a61f819de25658595afa/pytorch_classification/mini_imagenet/train_single_gpu.py#L27-L63","documentation":"The single-GPU training script compares args.num_classes (used to build the model's classifier) with the number of distinct labels in the training dataset; if they differ it raises ValueError showing both numbers. This guard prevents training a model whose output dimensionality doesn't match the label space.","triggerScenarios":"Running train_single_gpu.py with --num_classes N where N != number of classes in class_indices.json built from new_train.csv.","commonSituations":"Switching datasets without updating the CLI argument, stale class_indices.json from an older dataset, forgetting that Mini-ImageNet has 64 train classes instead of 1000.","solutions":["Pass the correct --num_classes matching the dataset (e.g. 64 for Mini-ImageNet train split).","Regenerate class_indices.json and the CSVs after any dataset change.","Print len(train_dataset.labels) before launching to confirm the expected count."],"exampleFix":"// before\npython train_single_gpu.py --num_classes=5\n// after\npython train_single_gpu.py --num_classes=64","handlingStrategy":"validation","validationCode":"import json\nwith open(json_path) as f:\n    class_indices = json.load(f)\nassert args.num_classes == len(class_indices), \\\n    f\"--num_classes={args.num_classes} but dataset has {len(class_indices)} classes\"","typeGuard":"def num_classes_matches(args, dataset_labels) -> bool:\n    return getattr(args, \"num_classes\", None) == len(dataset_labels)","tryCatchPattern":"try:\n    train_loop(args)\nexcept ValueError as e:\n    if \"classes\" in str(e):\n        print(f\"Fix: pass --num_classes={len(train_dataset.labels)}\")\n    raise","preventionTips":["Read num_classes from class_indices.json programmatically","Re-run the dataset parse/split script after data changes","Log the dataset class count at startup","Avoid hard-coded values like 1000 copied from ImageNet scripts"],"tags":["python","pytorch","valueerror","dataset","cli-args"],"backgroundTag":"num-classes-mismatch","analyzedSha":"1ec3fe6f374fc9969973a61f819de25658595afa","analyzedAt":"2026-08-30T09:19:11.901Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}