问题描述
我正在处理 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。
解决方法
我遇到过类似的问题,但我没有使用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]