I quantified the model based on the tutorial, but the model’s error is a bit large. Therefore, I try to quantify the data myself, then dequantize it, and finally calculate the convolution, and find that this error is smaller than the error of the tutorial method. what is the reason? Did I miss some steps when quantifying the model? The following is a demo.
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.quantization import QuantStub, DeQuantStub
torch.backends.quantized.engine = 'qnnpack'
class Test(nn.Module):
def __init__(self):
super(Test, self).__init__()
self.conv = nn.Conv2d(132, 121, 3, 1, bias=False)
self.quan = QuantStub()
self.dequan = DeQuantStub()
nn.init.kaiming_normal_(self.conv.weight, mode='fan_out')
def forward(self, x):
out = self.quan(x)
out = self.conv(out)
out = self.dequan(out)
return out
def test():
model = Test()
weight = model.conv.weight
conv = nn.Conv2d(132, 121, 3, 1, bias=False)
conv.weight = weight
max, min = torch.max(weight.flatten()), torch.min(weight.flatten())
scale = (max - min) / 256
temp = torch.quantize_per_tensor(weight, scale=scale.item(), zero_point=0, dtype=torch.qint8)
temp_de = temp.dequantize()
example = torch.rand(1, 132, 64, 64)
print(F.mse_loss(temp_de, weight))
# tensor(1.9924e-07, grad_fn=<MeanBackward0>)
print(F.mse_loss(F.conv2d(example, weight=temp_de, bias=None, stride=1), conv(example)))
# tensor(8.7799e-05, grad_fn= < MeanBackward0 >)
torch.backends.quantized.engine = 'qnnpack'
model.qconfig = torch.quantization.get_default_qconfig('qnnpack')
torch.quantization.prepare(model, inplace=True)
torch.quantization.convert(model, inplace=True)
print(F.mse_loss(conv(example), model(example)))
# tensor(0.4824, grad_fn= < MseLossBackward >)
if __name__ == "__main__":
test()
print(torch.__version__)
# 1.5.0