细粒度结构化稀疏神经网络:第四节

摘要

深度神经网络 (DNN) 中的稀疏性已被广泛研究以压缩和加速资源受限环境中的模型。它通常可以分为非结构化细粒度稀疏性(将分布在神经网络中的多个个体权重归零)和结构化粗粒度稀疏性(修剪神经网络的子网络块)。细粒度稀疏可以实现高压缩比,但对硬件不友好,因此速度增益有限。另一方面,粗粒度的稀疏性不能同时在现代 GPU 上实现明显的加速和良好的性能。在本文中,我们第一个研究从头开始训练(N:M)细粒度结构化稀疏网络该网络可以在专门设计的 GPU 上同时保持非结构化细粒度稀疏性和结构化粗粒度稀疏性的优势。

具体来说,一个(2 : 4)稀疏网络可以在 Nvidia A100 GPU 上实现 2 倍加速而不降低性能。此外,我们提出了一种新颖有效的成分,一种稀疏精炼的直通估计器(SR-STE),以减轻优化过程中由普通 STE 计算的近似梯度的负面影响。我们还定义了一个度量,即稀疏架构发散 (SAD),以测量训练过程中稀疏网络的拓扑变化。最后,我们用 SAD 证明了 SR-STE 的优势,并通过对各种任务进行综合实验证明了 SR-STE 的有效性。

第四节 方法

N:M细粒度结构化稀疏性

在这里,我们定义了训练具有 N:M 细粒度结构化稀疏性的神经网络的问题。具有 N:M 稀疏性的神经网络满足在网络的每组 M 个连续权重中,最多有 N 个具有非零值的权重。图 1 说明了一个 2:4 的稀疏网络。一般来说,我们的目标是训练一个 N:M 稀疏神经网络:

 其中 D 表示观察到的数据,L 表示损失函数,表示 L 层神经网络的参数,S(W, N, M) 是 N:M 稀疏神经网络参数。

训练 N:M 稀疏网络的直通估计器 (STE)

 训练 N:M 稀疏网络的直接解决方案是简单地扩展直通估计器 (STE) (Bengio et al., 2013) 以执行在线基于幅度的修剪和稀疏参数更新,如图 2(a) 所示. STE 广泛用于模型量化(Rastegari 等人,2016 年),因为没有 STE 的量化函数是不可微的,并且使用 STE 优化的网络在仔细设置下具有良好的性能(Yin 等人,2019 年)。在 STE 中,在训练过程中保持一个密集的网络。在前向传播期间,我们将密集权重 W 投影到满足 N:M 稀疏性的稀疏权重 中。令 w ⊂ W 为 W 中的一组连续 M 个参数, 中的对应组。 w 的投影可以表示为:

 .直观地说,这个投影函数 S(·) 通过在每个连续的 M 参数组中将具有最低有效绝对值的 N 个参数设置为零,同时保持其他参数与以前相同,从而产生稀疏参数 Wf。前向传递中 N:M 稀疏子网络的即时计算如图 1 所示。

在反向传播期间不可微的投影函数 S(·) 动态生成 N:M 稀疏子网络。为了在反向传播过程中获得梯度,STE 在稀疏子网络 Wf 的基础上计算子网络的梯度,可以直接反向投影到密集网络作为密集参数的近似梯度。密集网络的近似参数更新规则(参见附录中的图 2(a))可以表示为

 

 其中 Wt 表示迭代 t 的密集参数,γt 表示学习率

使用 STE 的动态修剪分析

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要可视化基于卷积神经网络的水稻细粒度分类过程,可以使用Python的matplotlib库。以下是一个简单的示例代码,它可以加载训练好的模型并使用该模型对测试图像进行分类,并将分类过程可视化: ```python import tensorflow as tf from tensorflow.keras import datasets, layers, models import matplotlib.pyplot as plt import numpy as np # 加载数据集 (X_train, y_train), (X_test, y_test) = datasets.load_data() # 数据预处理 X_train = X_train.astype('float32') / 255 X_test = X_test.astype('float32') / 255 # 加载模型 model = models.load_model('rice_classification.h5') # 进行预测 predictions = model.predict(X_test) # 可视化预测结果 for i in range(10): # 显示原始图像 plt.imshow(X_test[i], cmap=plt.cm.binary) plt.xlabel(f"Actual: {y_test[i]}") plt.title(f"Predicted: {np.argmax(predictions[i])}") plt.show() # 显示第一层卷积层的特征图 img = np.expand_dims(X_test[i], axis=0) conv_layer = model.get_layer(index=0) feature_map = conv_layer.predict(img) plt.figure(figsize=(10,10)) for j in range(32): plt.subplot(8, 4, j+1) plt.imshow(feature_map[0,:,:,j], cmap='gray') plt.axis('off') plt.show() # 显示第一层卷积层的卷积核 filters, biases = conv_layer.get_weights() plt.figure(figsize=(10,10)) for j in range(32): plt.subplot(8, 4, j+1) plt.imshow(filters[:,:,0,j], cmap='gray') plt.axis('off') plt.show() ``` 在上面的示例代码中,我们首先加载了水稻细粒度图像数据集并进行了数据预处理。然后,我们使用`models.load_model()`函数加载了训练好的模型,并使用`predict()`函数对测试集进行了预测。接着,我们使用`imshow()`函数显示了一批测试图像的分类结果。然后,我们使用`get_layer()`函数获取了模型的第一层卷积层,并使用`predict()`函数获取了第一层卷积层的特征图。使用`subplot()`函数可视化了第一层卷积层的32个特征图。最后,我们使用`get_weights()`函数获取了第一层卷积层的卷积核,并使用`subplot()`函数可视化了这些卷积核。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值