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?