Zeroing out some weights doesn't seem to affect output tensor

I’m bumping into some strange behavior and was hoping someone could explain it to me or show me where I’m making a mistake.
I’m trying to figure out how certain types of changes to the weights of a pretrained network will affect the output tensor compared to an “untampered” network.
With that in mind I have two identical networks:

base_model = models.vgg16(pretrained=True)
modified_model = models.vgg16(pretrained=True)

and then I modify a given layer. config['layer'] is equal to one of the values returned from layers below.

layers = list(models.vgg16().state_dict().keys())
layers = [layer for layer in layers if layer.split('.')[-1] != 'bias']
sh = modified_model.state_dict()[config['layer']].shape 

for i,b in range(798):
    dim = i // sh[0]
    modified_model.state_dict()[config['layer']][i - dim*sh[0]][dim] = 0.0

I then take an image and transform,batch etc. and feed it through the two networks.

    transform = transforms.Compose([            
        transforms.Resize(256),                    
        transforms.CenterCrop(224),                
        transforms.ToTensor(),                     
        transforms.Normalize(                      
        mean=[0.485, 0.456, 0.406],                
        std=[0.229, 0.224, 0.225]                  
        )])
    url = """
    data:image/jpeg;base64,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

    """
    img = Image.fromarray(url_to_image(url))
    img_t = transform(img)
    
    batch_t = torch.unsqueeze(img_t, 0)
    
    base_model.eval();
    modified_model.eval();
    
    res_orig = base_model(img_t[None, ...])
    res_new = modified_model(img_t[None, ...])
    
    res_orig = res_orig.detach()
    res_new = res_new.detach()

and then print out L-norms and the equals value.

metrics = {"L1-Norm":np.linalg.norm(res_orig-res_new, ord=1), "L2-Norm":np.linalg.norm(res_orig-res_new, ord=2), "LInf-Norm":np.linalg.norm(res_orig-res_new, ord=np.inf)}
print(metrics)
print(torch.equal(res_orig,res_new))

I discoved that if config['layer'] is 'classifier.6.weight' or 'classifier.0.weight then the output of metrics and equals at the end is

{'L1-Norm': 0.0, 'L2-Norm': 0.0, 'LInf-Norm': 0.0}
True

But if it is any other weight layer then the outputs are different, for example classifier.3.weight is

{'L1-Norm': 2.3841858e-07, 'L2-Norm': 4.7497085e-07, 'LInf-Norm': 1.3113022e-06}
False

and features.26.weight is

{'L1-Norm': 1.9073486e-06, 'L2-Norm': 7.4874556e-06, 'LInf-Norm': 0.00014960021}
False

and so on for every other layer besides the 0th and 6th classifier layers.

Can someone please explain why this is happening?

Is this possible that this is a image specific issue, that somehow certain images wouldn’t activate certain nodes of the fully connected layers?

You might get “unlucky”, e.g. if the input activation were zeroed out through the last ReLU in the features submodule.
To verify it, you could e.g. also zero out the bias of the selected layer, which you would like to manipulate.

1 Like

@ptrblck Thanks for the reply. If that is the case that the input activations were zeroed out then we would not expect this behavior to hold on a dataset of images, correct?

Why would this not be the case for image inputs?

Sorry, I meant to emphasize a dataset of images as opposed to a single image, not that their is something special about images in general.

That seems plausible. You could verify it by checking the input activation (e.g. via forward hooks) and check the weights as well as the bias of the following layer, which you’ve manipulated.

1 Like