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

基于修改后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。

调整步骤:

  1. 生成随机图像时显式指定dtype=torch.float32,和原数据集保持一致
  2. 创建新增数据集时,使用归一化后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:33:20