Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pytorch CNN模型中的BatchNorma2d错误_Python_Image_Pytorch_Cnn_Batchnorm - Fatal编程技术网

Python pytorch CNN模型中的BatchNorma2d错误

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

我的数据库有大小为128*128*1的灰度图像,每个图像的批量大小为10 我使用的是cnn模型,但我在BatchNorm2d中遇到了这个错误
预期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输入。但是,如果没有更多的代码,就无法确定。