权重直方图绘制以及打印量化后模型权重参数

resnet18 的 layer1量化前

代码实现

代码参考:Efficient-Neural-Network-Bilibili / 3-Quantization / 3-2_Linear_Quantization.ipynb

from matplotlib import pyplot as plt

def plot_weights(model):
    modules = [module for module in model.modules()]
    num_sub_plot = 0
    for i, layer in enumerate(modules):
        if hasattr(layer, 'weight'):
            plt.subplot(421+num_sub_plot)
            w = layer.weight.data
            w_one_dim = w.cpu().numpy().flatten()
            plt.hist(w_one_dim, bins=50)
            num_sub_plot += 1
    plt.show()

其中

  • plt.subplot()为绘制子图,4行2列,一共8个子图,子图序号从1开始
  • plt.hist (x, bins=None):x为作直方图所要用的数据,必须是一维数组;bins为直方图的柱数,即要分的组数
# 量化前
plot_weights(r18_o.layer1)

结果:
在这里插入图片描述

resnet18 的 layer1量化后的权重参数

获取量化后权重参数主要参考下面博客中的方法
天才da熊猫:pytorch的模型解析

代码实现

def plot_qweights(model):
    modules = [module for module in model.modules()]
    # print(modules)
    num_sub_plot = 0
    for i, layer in enumerate(modules):
        if i == 2 or i == 5 or i == 10 or i == 13:
            print('\n i =', i)
            print('\n layer \n', layer)
            plt.subplot(221 + num_sub_plot)
            # Get the  weights
            mod_c = layer._c
            # print(mod_c.dump())
            param = layer.__getattr__('_packed_params')
            weight, bias = param.unpack()
            # print('\n weight \n\n', weight)
            w = weight.clone()          # 创建副本
            w1 = w[0]                   # 获取第一个元素张量
            print(w1.int_repr())
            w_one_dim =w1.int_repr().cpu().numpy().flatten()
            plt.hist(w_one_dim, bins=50)
            num_sub_plot += 1
            
    plt.show()
  • 使用weight, bias = param.unpack() 获取的量化后的权重张量的类型为torch.qint8,打印结果如下,可看到其中包含多个元素张量。因此,可以使用索引 [0] 来获取第一个元素张量

需要注意:索引操作返回的是原始张量的视图而不是副本。如果修改了 ,则可能会影响原始张量中对应的元素张量。可以使用 .clone() 方法创建一个副本
在这里插入图片描述
在这里插入图片描述

可以使用 int_repr() 获取量化张量的整数表示。下文中演示了tensor量化和反量化的具体过程。
pytorch中模型量化方案qconfig设置

量化后

plot_qweights(r18_q.layer1)

结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Python的NetworkX库来实现根据图的权重画拓扑图的功能。下面是一个简单的示例代码: ```python import networkx as nx import matplotlib.pyplot as plt # 创建图 G = nx.Graph() # 添加节点 G.add_nodes_from(['A', 'B', 'C', 'D']) # 添加边和权重 G.add_edge('A', 'B', weight=2) G.add_edge('A', 'C', weight=3) G.add_edge('B', 'C', weight=1) G.add_edge('B', 'D', weight=4) G.add_edge('C', 'D', weight=5) # 获取边的权重 edge_weights = nx.get_edge_attributes(G, 'weight') # 设置边的粗细 edge_widths = [0.1 * G[u][v]['weight'] for u, v in G.edges()] # 绘制图形 pos = nx.circular_layout(G) nx.draw_networkx_nodes(G, pos, node_color='lightblue', node_size=500) nx.draw_networkx_edges(G, pos, width=edge_widths, edge_color='gray') nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_weights, font_color='red') nx.draw_networkx_labels(G, pos, font_size=16, font_family='sans-serif') # 显示图形 plt.axis('off') plt.show() ``` 在上面的代码中,我们首先创建了一个包含4个节点的图,并添加了5条带权重的边。然后,我们使用`nx.get_edge_attributes`函数获取每条边的权重,并将其存储在`edge_weights`字典中。接着,我们计算每条边的粗细,将其存储在`edge_widths`列表中。最后,我们使用`nx.draw_networkx_nodes`和`nx.draw_networkx_edges`函数绘制图形,并使用`nx.draw_networkx_edge_labels`和`nx.draw_networkx_labels`函数添加标签。 运行上面的代码,你会得到一个带权重的拓扑图,其中边的粗细代表了它们的权重大小。你可以根据需要修改节点的颜色、边的颜色和样式等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值