RuntimeError: Given groups=1, weight of size [64, 3, 3, 3], 预期输入 [64, 1, 32, 32] 有 3 个通道,但得到 1 个通道

问题描述

我正在处理 SVHN 数据集,但仅在训练阶段出现此错误。在模型的实例化过程中,它起作用了。

RuntimeError: Given groups=1,weight of size [64,3,3],expected input[64,1,32,32] to have 3 channels,but got 1 channels instead

为了确保有 3 个通道,我写了 Grayscale(3) 转换。

# Compose transformations
data_transform = transforms.Compose([
  transforms.Resize((32,32)),transforms.Grayscale(num_output_channels=3),transforms.RandomHorizontalFlip(),transforms.ToTensor(),])

# Compose transformations
test_transform = transforms.Compose([
  transforms.Resize((32,])

# Load MNIST dataset with transforms
train_set_svhn = torchvision.datasets.SVHN(root=base_dir,split='train',download=True,transform=data_transform,target_transform=None)
test_set_svhn = torchvision.datasets.SVHN(root=base_dir,split='test',transform=test_transform)
class VGG16(nn.Module):

    def __init__(self,num_classes):
        super(VGG16,self).__init__()

        # calculate same padding:
        # (w - k + 2*p)/s + 1 = o
        # => p = (s(o-1) - w + k)/2

        self.block_1 = nn.Sequential(
            nn.Conv2d(in_channels=3,out_channels=64,kernel_size=(3,3),stride=(1,1),# (1(32-1)- 32 + 3)/2 = 1
                      padding=1),nn.Batchnorm2d(64),nn.ReLU(),nn.Conv2d(in_channels=64,padding=1),nn.MaxPool2d(kernel_size=(2,2),stride=(2,2))
        )

        self.block_2 = nn.Sequential(
            nn.Conv2d(in_channels=64,out_channels=128,nn.Batchnorm2d(128),nn.Conv2d(in_channels=128,2))
        )
        
        self.block_3 = nn.Sequential(
            nn.Conv2d(in_channels=128,out_channels=256,nn.Batchnorm2d(256),nn.Conv2d(in_channels=256,2))
        )
           

        self.classifier = nn.Sequential(
            nn.Linear(4096,4096),nn.ReLU(True),nn.Dropout(p=0.25),nn.Linear(4096,num_classes),)

        for m in self.modules():
            if isinstance(m,torch.nn.Conv2d) or isinstance(m,torch.nn.Linear):
                nn.init.kaiming_uniform_(m.weight,mode='fan_in',nonlinearity='leaky_relu')
#                 nn.init.xavier_normal_(m.weight)
                if m.bias is not None:
                    m.bias.detach().zero_()

        # self.avgpool = nn.AdaptiveAvgPool2d((7,7))

    def forward(self,x):

        x = self.block_1(x)
        x = self.block_2(x)
        x = self.block_3(x)
        # x = self.avgpool(x)
        x = x.view(x.size(0),-1)
        logits = self.classifier(x)
        probas = F.softmax(logits,dim=1)
        # probas = nn.softmax(logits)
        return probas
        # return logits

我不知道那个 1 来自哪里

此外,这是没有分类器(全连接层)的模型输出的形状:

output = model1(test_x)
output.shape
torch.Size([1,256,4,4])

事实上,我会将 256x4x4 作为输入传递给第一个 FC。

编辑:

enter image description here

解决方法

我遇到过类似的问题,但我没有使用MNIST数据集。我确认我用的是(256256,3)的输入文件,下面是我的脚本文件。

RuntimeError: Given groups=1,weight of size [64,3,4,4],expected input[2,2,64,64] to have 3 channels,but got 2 channels instead[enter image description here][1]