自学内容网 自学内容网

神经网络模型量化代码解析

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)!