基于MNIST数据集的PyTorch GAN项目报错:'module' object is not callable
PyTorch加载MNIST数据集时TypeError错误解决方法
在使用PyTorch构建生成对抗网络(GAN)并处理MNIST数据集时,遍历DataLoader过程中触发如下错误:
TypeError: 'module' object is not callable
相关代码片段
导入模块:
import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.datasets as datasets from torch.utils.data import DataLoader, Dataset import torchvision.transforms as transforms from torch.utils.tensorboard import SummaryWriter
数据集与DataLoader定义:
dataset = datasets.MNIST(root="dataset/",transform = transforms,download = True) loader = DataLoader(dataset, batch_size = batch_size,shuffle = True)
遍历代码:
for epoch in range(num_epochs): for batch_idx, (real, _) in enumerate(loader): real = real.view(-1, 784).to(device)
完整报错栈
Traceback (most recent call last): File "C:\Users\utkar\PycharmProjects\simpleGAN\main.py", line 57, in <module> for batch_idx, (real, _) in enumerate(loader): File "C:\Users\utkar\Anaconda3\envs\deeplearning\lib\site-packages\torch\utils\data\dataloader.py", line 628, in __next__ data = self._next_data() File "C:\Users\utkar\Anaconda3\envs\deeplearning\lib\site-packages\torch\utils\data\dataloader.py", line 671, in _next_data data = self._dataset_fetcher.fetch(index) # may raise StopIteration File "C:\Users\utkar\Anaconda3\envs\deeplearning\lib\site-packages\torch\utils\data\_utils\fetch.py", line 58, in fetch data = [self.dataset[idx] for idx in possibly_batched_index] File "C:\Users\utkar\Anaconda3\envs\deeplearning\lib\site-packages\torch\utils\data\_utils\fetch.py", line 58, in <listcomp> data = [self.dataset[idx] for idx in possibly_batched_index] File "C:\Users\utkar\Anaconda3\envs\deeplearning\lib\site-packages\torchvision\datasets\mnist.py", line 145, in __getitem__ img = self.transform(img) TypeError: 'module' object is not callable
错误原因
- 核心问题:创建MNIST数据集时,
transform参数传入的是整个transforms模块,而非可调用的变换实例。数据集在获取样本时会执行self.transform(img),尝试调用传入的对象,但模块本身无法被调用,因此触发错误。
修复方案
需要将具体的变换操作通过transforms.Compose()组合成可调用的变换流水线,最基础的是将图像转换为PyTorch Tensor。修改后的代码如下:
# 定义变换流水线:将图像转为Tensor transform = transforms.Compose([ transforms.ToTensor() ]) dataset = datasets.MNIST(root="dataset/", transform=transform, download=True) loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
如果需要添加归一化等更多预处理操作,可直接在Compose中扩展:
transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) # 对单通道MNIST图像做归一化 ])
内容的提问来源于stack exchange,提问作者Cosmo
相关产品推荐
相关产品推荐

