RuntimeError: Given groups=1, weight of size [1000, 512, 1, 1], expected input[4, 384, 1, 1] to have 512 channels, but got 384 channels instead

Hi I am to trying to reduce some layers of squeezenet

model = models.squeezenet1_1(pretrained=False)
PruneModels=[]
PruneModels.append(model)
PruneAcc=[]
PruneLoss=[]
bnum=[]
name = (f'{model.__class__.__name__}')

while PruneModels:
    model = PruneModels.pop()
    accs = []
    torch.cuda.empty_cache()

    if name =='SqueezeNet': # 13 blocks
        for find in range(len(model.features)-1, 3, -1):
            del model.features[find]
            last_features = 0
            try:
                last_features = model.features[-1].expand3x3.out_channels
                last_features *= 2
                model.classifier[1].in_channels=last_features
                loss, acc = start_train(model)

during training I got the following error

RuntimeError: Given groups=1, weight of size [1000, 512, 1, 1], expected input[4, 384, 1, 1] to have 512 channels, but got 384 channels instead

and the below is squeezenet architecture

(11): Fire(
  (squeeze): Conv2d(384, 64, kernel_size=(1, 1), stride=(1, 1))
  (squeeze_activation): ReLU(inplace=True)
  (expand1x1): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1))
  (expand1x1_activation): ReLU(inplace=True)
  (expand3x3): Conv2d(64, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (expand3x3_activation): ReLU(inplace=True)
)
**(12): Fire(**

** (squeeze): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1))**
** (squeeze_activation): ReLU(inplace=True)**
** (expand1x1): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1))**
** (expand1x1_activation): ReLU(inplace=True)**
** (expand3x3): Conv2d(64, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))**
** (expand3x3_activation): ReLU(inplace=True)**
** )**
** )**
(classifier): Sequential(
(0): Dropout(p=0.5, inplace=False)
(1): Conv2d(512, 1000, kernel_size=(1, 1), stride=(1, 1))
(2): ReLU(inplace=True)
(3): AdaptiveAvgPool2d(output_size=(1, 1))
)
)

In code, I set the (classifer) Conv2D input to correspond to the last conv layer. If I remove the bolded block, then (11) expanded3x3 layer is the target and got error below

RuntimeError: Given groups=1, weight of size [1000, 512, 1, 1], expected input[4, 384, 1, 1] to have 512 channels, but got 384 channels instead

I set the Conv2d input as 512, 384,… by hardcoding but none of them work

I have thought some skip connection is the matter? but there was no skip connection in 11~12 block…

how to deal with this problem? the below is the full structure of squeezenet

[SqueezeNet(
(features): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(2, 2))
(1): ReLU(inplace=True)
(2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)
(3): Fire(
(squeeze): Conv2d(64, 16, kernel_size=(1, 1), stride=(1, 1))
(squeeze_activation): ReLU(inplace=True)
(expand1x1): Conv2d(16, 64, kernel_size=(1, 1), stride=(1, 1))
(expand1x1_activation): ReLU(inplace=True)
(expand3x3): Conv2d(16, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(expand3x3_activation): ReLU(inplace=True)
)
(4): Fire(
(squeeze): Conv2d(128, 16, kernel_size=(1, 1), stride=(1, 1))
(squeeze_activation): ReLU(inplace=True)
(expand1x1): Conv2d(16, 64, kernel_size=(1, 1), stride=(1, 1))
(expand1x1_activation): ReLU(inplace=True)
(expand3x3): Conv2d(16, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(expand3x3_activation): ReLU(inplace=True)
)
(5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)
(6): Fire(
(squeeze): Conv2d(128, 32, kernel_size=(1, 1), stride=(1, 1))
(squeeze_activation): ReLU(inplace=True)
(expand1x1): Conv2d(32, 128, kernel_size=(1, 1), stride=(1, 1))
(expand1x1_activation): ReLU(inplace=True)
(expand3x3): Conv2d(32, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(expand3x3_activation): ReLU(inplace=True)
)
(7): Fire(
(squeeze): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1))
(squeeze_activation): ReLU(inplace=True)
(expand1x1): Conv2d(32, 128, kernel_size=(1, 1), stride=(1, 1))
(expand1x1_activation): ReLU(inplace=True)
(expand3x3): Conv2d(32, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(expand3x3_activation): ReLU(inplace=True)
)
(8): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)
(9): Fire(
(squeeze): Conv2d(256, 48, kernel_size=(1, 1), stride=(1, 1))
(squeeze_activation): ReLU(inplace=True)
(expand1x1): Conv2d(48, 192, kernel_size=(1, 1), stride=(1, 1))
(expand1x1_activation): ReLU(inplace=True)
(expand3x3): Conv2d(48, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(expand3x3_activation): ReLU(inplace=True)
)
(10): Fire(
(squeeze): Conv2d(384, 48, kernel_size=(1, 1), stride=(1, 1))
(squeeze_activation): ReLU(inplace=True)
(expand1x1): Conv2d(48, 192, kernel_size=(1, 1), stride=(1, 1))
(expand1x1_activation): ReLU(inplace=True)
(expand3x3): Conv2d(48, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(expand3x3_activation): ReLU(inplace=True)
)
(11): Fire(
(squeeze): Conv2d(384, 64, kernel_size=(1, 1), stride=(1, 1))
(squeeze_activation): ReLU(inplace=True)
(expand1x1): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1))
(expand1x1_activation): ReLU(inplace=True)
(expand3x3): Conv2d(64, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(expand3x3_activation): ReLU(inplace=True)
)
(12): Fire(
(squeeze): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1))
(squeeze_activation): ReLU(inplace=True)
(expand1x1): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1))
(expand1x1_activation): ReLU(inplace=True)
(expand3x3): Conv2d(64, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(expand3x3_activation): ReLU(inplace=True)
)
)
(classifier): Sequential(
(0): Dropout(p=0.5, inplace=False)
(1): Conv2d(512, 1000, kernel_size=(1, 1), stride=(1, 1))
(2): ReLU(inplace=True)
(3): AdaptiveAvgPool2d(output_size=(1, 1))
)
)

Changing the in_channels after initializing the module won’t work as seen here:

conv = nn.Conv2d(384, 1, 3, 1, 1)
print(conv.weight.shape)
# torch.Size([1, 384, 3, 3])

conv.in_channels = 512
print(conv.weight.shape)
# torch.Size([1, 384, 3, 3])
print(conv)
# Conv2d(512, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
1 Like