基于修改后MNIST数据集训练模型遇TypeError,需调整何参数?
问题:扩展MNIST数据集训练时触发TypeError
尝试基于修改后的MNIST数据集训练模型,新增标签为10的随机图像,但持续触发TypeError。已尝试修改标签的数据类型,问题仍未解决,请问需要调整哪个参数?
相关代码
transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) dataset1 = datasets.MNIST(root='./data', train=True, transform = transform) dataset2 = datasets.MNIST(root='./data', train=False, transform=transform) num_new_images = 7000 noisy_images = torch.randn(num_new_images, 1, 28, 28) mean = 0.1307 std = 0.3081 random_images = (noisy_images-mean)/std noisy_labels = torch.full((num_new_images,),10, dtype=torch.long) new_dataset = torch.utils.data.TensorDataset(noisy_images, noisy_labels) combined_dataset = torch.utils.data.ConcatDataset([dataset1, new_dataset]) len(combined_dataset) num_val_images = 1000 noisy_images = torch.randn(num_val_images, 1, 28, 28) random_val_images = (noisy_images-mean)/std noisy_val_labels = torch.full((num_val_images,),10, dtype=torch.long) new_val_dataset = torch.utils.data.TensorDataset(random_val_images, noisy_val_labels) combined_val_dataset = torch.utils.data.ConcatDataset([dataset2, new_val_dataset]) batch_size = 128 train_loader = torch.utils.data.DataLoader(combined_dataset, batch_size=batch_size, shuffle=True) test_loader = torch.utils.data.DataLoader(combined_val_dataset, batch_size=batch_size, shuffle=False)
报错信息
TypeError Traceback (most recent call last) Cell In[12], line 74 72 # Train the neural network 73 for epoch in range(num_epochs): ---> 74 for images, labels in train_loader: 75 outputs = model(images) 76 loss = criterion(outputs, labels) File ~\PycharmProjects\tensorflow_start\venv\Lib\site-packages\torch\utils\data\dataloader.py:633, in _BaseDataLoaderIter.__next__(self) 630 if self._sampler_iter is None: 631 # TODO(https://github.com/pytorch/pytorch/issues/76750) 632 self._reset() # type: ignore[call-arg] --> 633 data = self._next_data() 634 self._num_yielded += 1 635 if self._dataset_kind == _DatasetKind.Iterable and \ 636 self._IterableDataset_len_called is not None and \ 637 self._num_yielded > self._IterableDataset_len_called:
解决方案
问题核心是新增数据集的图像数据类型与原MNIST不匹配:
- 原MNIST经
transforms.ToTensor()处理后,图像为torch.float32类型 - 你生成的
noisy_images默认是torch.float64,且创建训练集时误用了未归一化的noisy_images,导致拼接后的数据集包含两种不同类型的张量,DataLoader迭代时无法统一类型,触发TypeError。
调整步骤:
- 生成随机图像时显式指定
dtype=torch.float32,和原数据集保持一致 - 创建新增数据集时,使用归一化后的
random_images而非原始的noisy_images
修改后的关键代码片段:
# 训练集部分 num_new_images = 7000 # 显式指定float32类型 noisy_images = torch.randn(num_new_images, 1, 28, 28, dtype=torch.float32) mean = 0.1307 std = 0.3081 random_images = (noisy_images - mean) / std noisy_labels = torch.full((num_new_images,), 10, dtype=torch.long) # 使用归一化后的random_images创建数据集 new_dataset = torch.utils.data.TensorDataset(random_images, noisy_labels) # 验证集部分同理 num_val_images = 1000 noisy_images = torch.randn(num_val_images, 1, 28, 28, dtype=torch.float32) random_val_images = (noisy_images - mean) / std noisy_val_labels = torch.full((num_val_images,), 10, dtype=torch.long) new_val_dataset = torch.utils.data.TensorDataset(random_val_images, noisy_val_labels)
额外注意:模型输出层需调整为11个神经元(对应0-10共11个类别),否则会因输出维度与标签不匹配引发其他错误。
内容的提问来源于stack exchange,提问作者Jacky02
相关产品推荐
相关产品推荐

