Python pytorch CNN模型中的BatchNorma2d错误
我的数据库有大小为128*128*1的灰度图像,每个图像的批量大小为10 我使用的是cnn模型,但我在BatchNorm2d中遇到了这个错误Python pytorch CNN模型中的BatchNorma2d错误,python,image,pytorch,cnn,batchnorm,Python,Image,Pytorch,Cnn,Batchnorm,我的数据库有大小为128*128*1的灰度图像,每个图像的批量大小为10 我使用的是cnn模型,但我在BatchNorm2d中遇到了这个错误 预期4D输入(获得2D输入) 我发布了我用来变换图像的方法(灰度-张量-归一化)并将其分批处理 data_transforms = { 'train': transforms.Compose([ transforms.Grayscale(num_output_channels=1), transforms.Resiz
预期4D输入(获得2D输入) 我发布了我用来变换图像的方法(灰度-张量-归一化)并将其分批处理
data_transforms = {
'train': transforms.Compose([
transforms.Grayscale(num_output_channels=1),
transforms.Resize(128),
transforms.CenterCrop(128),
transforms.ToTensor(),
transforms.Normalize([0.5], [0.5])
]),
'val': transforms.Compose([
transforms.Grayscale(num_output_channels=1),
transforms.Resize(128),
transforms.CenterCrop(128),
transforms.ToTensor(),
transforms.Normalize([0.5], [0.5])
]),
}
data_dir = '/content/drive/My Drive/Colab Notebooks/pytorch'
dsets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x])
for x in ['train', 'val']}
dset_loaders = {x: torch.utils.data.DataLoader(dsets[x], batch_size=10,
shuffle=True, num_workers=25)
for x in ['train', 'val']}
dset_sizes = {x: len(dsets[x]) for x in ['train', 'val']}
dset_classes = dsets['train'].classes
我用这个模型
class HeartNet(nn.Module):
def __init__(self, num_classes=7):
super(HeartNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(1, 64, kernel_size=3, stride=1, padding=1),
nn.ELU(inplace=True),
nn.BatchNorm2d(64),
nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
nn.ELU(inplace=True),
nn.BatchNorm2d(64),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
nn.ELU(inplace=True),
nn.BatchNorm2d(128),
nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
nn.ELU(inplace=True),
nn.BatchNorm2d(128),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
nn.ELU(inplace=True),
nn.BatchNorm2d(256),
nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
nn.ELU(inplace=True),
nn.BatchNorm2d(256),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.classifier = nn.Sequential(
nn.Dropout(0.5),
nn.Linear(16*16*256, 2048),
nn.ELU(inplace=True),
nn.BatchNorm2d(2048),
nn.Linear(2048, num_classes)
)
nn.init.xavier_uniform_(self.classifier[1].weight)
nn.init.xavier_uniform_(self.classifier[4].weight)
def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), 16 * 16 * 256)
x = self.classifier(x)
return x
如何解决这个问题?您的
self.classifier
子网络中的批处理规范层有问题:当您的self.features
子网络是完全卷积的且需要BatchNorm2d
时,self.classifier
子网络是一个完全连接的多层感知器(MLP)网络,本质上是一维的。注意forward
函数如何在将空间维度输入分类器之前从特征映射x
中移除空间维度
尝试将
self.classifier
中的BatchNorm2d
替换为BatchNorm1d
问题在于如何输入数据。模型的输入是4D,这是正确的,因为数据的格式应该是(批量大小,x,y,通道)
。我的最佳猜测是,由于您的图像是灰度图像,因此它已删除最后一个维度,并且出于某种原因,您正在输入“batch_size=1”的数据,这反过来使其成为2D输入。但是,如果没有更多的代码,就无法确定。