【轻量化:实操】动手实现神经网络中的裁枝操作(附演示代码&yolo系列)

简介: 【轻量化:实操】动手实现神经网络中的裁枝操作(附演示代码&yolo系列)

前言

   神经网络中的裁剪操作指的是去除网络中一些不必要的权重或节点,从而减少网络的复杂度和计算量,提高网络的效率和泛化能力。

裁枝简介

  神经网络模型中的参数数量很大,模型大小可能会限制模型的部署和使用,裁剪可以有效地减少网络中的参数数量,从而减小模型的大小,使其更加易于部署和使用;在神经网络在推理时需要进行大量的乘加操作,计算量非常大,裁剪可以减少网络中的冗余连接和参数,从而降低计算量,提高网络的推理速度;裁剪可以去除网络中的一些冗余连接和参数,从而减少网络的过拟合风险,提高网络的泛化能力;神经网络通常被认为是“黑盒子”,很难理解它们是如何做出决策的。裁剪可以去除网络中的一些冗余连接和参数,从而提高网络的可解释性,使人们更容易理解网络是如何做出决策的;裁剪可以降低神经网络的存储和计算要求,从而使神经网络更加适合在嵌入式设备等计算资源受限的环境中使用

总结:

  1. 减少模型大小
  2. 加速推理
  3. 提高泛化能力
  4. 更好的可解释性
  5. 更低的存储和计算要求

实现步骤

  神经网络裁剪(Pruning)是一种常见的神经网络压缩技术,可以通过去除网络中冗余的连接和参数来减少网络的大小和计算量,从而提高网络的效率和泛化能力。以下是在神经网络中进行裁枝操作的一般步骤:

  1. 训练原始网络:首先需要训练出一个较为精度的原始网络,该网络可以使用任何一种常见的训练算法进行训练,例如随机梯度下降(SGD)、Adam等。
  2. 计算权重重要性:使用一种重要性指标来衡量每个参数的重要性,例如绝对值大小、梯度大小等。一般情况下,重要性指标越小的参数越容易被裁剪。
  3. 去除冗余参数:将网络中重要性指标较小的参数或连接去除,可以通过将它们的权重值设为零或者将其对应的连接删去来实现。通常情况下,裁剪的比例在20%~90%之间。
  4. 重新训练网络:对裁剪后的网络进行微调,以便保持其精度和泛化能力。

实操步骤

  我们对较为经典的一个网络进行裁枝操作,在这里我们选择较为简单的网络作为模板进行操作。这里选择图像分类任务(步骤详见:# 【基础实操】借用torch自带网络进行训练自己的图像数据 ) 作为基础任务向大家展示:

ini

复制代码

import torch.nn as nn
import torch.nn.utils.prune as prune
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, kernel_size=5)
        self.relu1 = nn.ReLU(inplace=True)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
        self.relu2 = nn.ReLU(inplace=True)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.relu3 = nn.ReLU(inplace=True)
        self.fc2 = nn.Linear(120, 84)
        self.relu4 = nn.ReLU(inplace=True)
        self.fc3 = nn.Linear(84, 10)
    def forward(self, x):
        x = self.conv1(x)
        x = self.relu1(x)
        x = self.conv2(x)
        x = self.relu2(x)
        x = x.view(-1, 16 * 5 * 5)
        x = self.fc1(x)
        x = self.relu3(x)
        x = self.fc2(x)
        x = self.relu4(x)
        x = self.fc3(x)
        return x
# 定义一个网络实例
net = Net()
# 对网络进行剪枝操作
parameters_to_prune = (
    (net.conv1, 'weight'),
    (net.conv2, 'weight'),
    (net.fc1, 'weight'),
    (net.fc2, 'weight'),
    (net.fc3, 'weight'),
)
prune.global_unstructured(
    parameters_to_prune,
    pruning_method=prune.L1Unstructured,
    amount=0.2,
)
# 使用剪枝后的网络进行训练

对于上述网络中我们可以得到一个10分类的网络。

yolo 系列

  在bubbliiiing博主的yolo系列的代码中,我们在train.py文件中找到创建yolo模型,在载入model后,对bubbliiiing博主的主干网络中的三个特征图进行压缩裁枝操作。下面是部分代码,可供参考。

ini

复制代码

#------------------------------------------------------#
#   创建yolo模型
#------------------------------------------------------#
model = YoloBody(anchors_mask, num_classes, phi, pretrained=pretrained)
parameters_to_prune = (
    (model.yolo_head_P3, 'weight'),
    (model.yolo_head_P3, 'weight'),
    (model.yolo_head_P3, 'weight'),
)
prune.global_unstructured(
    parameters_to_prune,
    pruning_method=prune.L1Unstructured,
    amount=0.2,
)


相关文章
|
20天前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
126 0
|
26天前
|
机器学习/深度学习 算法 物联网
【SCI】利用信念传播在超密集无线网络中进行分布式信道分配(Matlab代码实现)
【SCI】利用信念传播在超密集无线网络中进行分布式信道分配(Matlab代码实现)
|
20天前
|
机器学习/深度学习 并行计算 算法
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)
|
16天前
|
机器学习/深度学习 缓存 算法
2025年华为杯A题|通用神经网络处理器下的核内调度问题研究生数学建模|思路、代码、论文|持续更新中....
2025年华为杯A题|通用神经网络处理器下的核内调度问题研究生数学建模|思路、代码、论文|持续更新中....
231 1
|
16天前
|
算法 数据挖掘 区块链
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
|
20天前
|
传感器 数据采集 存储
【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)
【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)
|
20天前
|
机器学习/深度学习 编解码 并行计算
【创新未发表!】基于BKA算法优化-BP、HO算法优化-BP、CP算法优化-BP、GOOSE算法优化-BP、NRBO算法优化-BP神经网络回归预测比较研究(Matlab代码)
【创新未发表!】基于BKA算法优化-BP、HO算法优化-BP、CP算法优化-BP、GOOSE算法优化-BP、NRBO算法优化-BP神经网络回归预测比较研究(Matlab代码)
|
20天前
|
机器学习/深度学习 数据采集 资源调度
基于长短期记忆网络定向改进预测的动态多目标进化算法(LSTM-DIP-DMOEA)求解CEC2018(DF1-DF14)研究(Matlab代码实现)
基于长短期记忆网络定向改进预测的动态多目标进化算法(LSTM-DIP-DMOEA)求解CEC2018(DF1-DF14)研究(Matlab代码实现)
|
10月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
226 17
|
10月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
179 10

热门文章

最新文章