神经网络模型量化代码解析
PTQ Post Training Quantization 是训练后量化,也叫做离线量化,根据量化零点 是否为 0,训练后量化分为对称量化和非对称量化;根据数据通道顺序 NHWC(TensorFlow) 这一维度区分,训练后量化又分为逐层量化和逐通道量化。目前 nvidia 的 TensorRT 框架中使用了逐层量化的方法,每一层采用同一个阈值来进行量化。逐通道量化就是对每一层每个通道都有各自的阈值,对精度可以有一个很好的提升。
量化的本质就是映射,神经网络权值一般在[-1,1],量化后 映射到 int8 也就是 [0,255]
可以看出 映射的本质也是函数,而且也就是 直线函数
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
import torch
import torchvision
import matplotlib.pyplot as plt
# 加载预训练的模型
model = torchvision.models.resnet18(pretrained=True)
# 获取卷积层的权值,量化前的权重
conv1_weights = model.conv1.weight.data
# 可视化权值
q_after=[]
plt.axis('off')
for i in range(64):
c=conv1_weights[i].numpy().flatten()
scale=255/(c.max()-c.min())
zero=255-c.max()*scale
qc=scale*c+zero
q_after.append(qc)
print(qc.round())
print(c.max(),c.min())
x = list(range(len(c)))
plt.plot(x,c)
#设置说明框
legend = plt.legend(loc='best', shadow=True)
frame = legend.get_frame()
frame.set_facecolor('0.90') #frame的颜色
plt.show()
print('量化后的权重')
print(np.array(q_after).reshape([64,3,7,7]))
原文地址:https://blog.csdn.net/luoganttcc/article/details/142989209
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!