前言 在上一篇推文[网络剪枝概述]中我们通过剪枝三问了解了网络剪枝技术的出现及发展等问题,这一篇推文我们将继续带领大家学习网络剪枝技术的评价指标和常用数据集,在清楚了这些基础概念后,从下节开始便会带领大家进入到剪枝方法的学习中。
本教程禁止转载。同时,本教程来自知识星球【CV技术指南】更多技术教程,可加入星球学习。
欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。
网络剪枝技术的评价指标
网络剪枝常用的评价指标一般包括以下几种:参数量、FLOPs、模型精度、剪枝率。下面我们会逐一介绍这些常用指标的含义。
参数量
参数量:指网络中的可训练参数数量。在网络剪枝中,我们希望通过去掉一些冗余和不必要的参数来减小网络的参数量,以此达到优化模型的效果。因此,参数量是一个很重要的评价指标。公式的一般形式如下:
参数量
其中, 表示网络中的层数, 表示第 层的权重参数, 表示第 层权重参数的大小。
卷积神经网络(Convolutional Neural Network,CNN)是一种常见的深度学习模型,我们以此为例讲解其参数量的计算方法。CNN由多个卷积层、池化层和全连接层组成。在CNN中,每一层的参数量的计算方式略有不同。
-
卷积层参数量计算 假设输入数据的形状为 ,输出数据的形状为 ,卷积核的大小为 ,卷积核的数量为 ,偏置项的数量为 。则该卷积层的参数量的计算方式为:
参数量
其中, 是因为每个输出通道都有一个偏置项。
-
全连接层参数量计算 全连接层中的参数包括权重和偏置项。如果全连接层输入的维度为 ,输出的维度为 ,则全连接层的参数量为:
参数量
其中, 是因为每个输出神经元都有一个偏置项。
-
池化层和归一化层参数量计算 池化层和归一化层通常不包含可训练参数,因此它们的参数量为 。
-
总参数量计算 对于一个卷积神经网络,它的总参数量等于每一层的参数量之和。具体地,如果一个卷积神经网络有 层,第 层的参数量为 ,则卷积神经网络的总参数量为:
总参数量
需要注意的是,卷积神经网络的参数量不包括输入层,因为输入层不包含可训练参数。同时,参数量的计算方式可能会因不同的框架和库而有所不同,上述计算方式仅为一种通用方式。
FLOPs
FLOPs:指网络进行一次前向传播所需要的浮点运算次数,是衡量模型计算量的重要指标。在网络剪枝中,我们希望通过减少一些不必要的计算,来降低模型的计算量。因此,FLOPs 也是一个很重要的评价指标。公式如下:
其中, 表示第 层的输出大小。
值得注意的是,”FLOPs“ 和 ”flops“ 虽然都是与计算量有关的概念,但是它们在大小写和含义上略有不同。
”FLOPs“ 全称为 ”floating-point operations“,表示浮点运算次数,通常用于评估神经网络的计算量。在深度学习中,浮点运算通常是指加法、减法、乘法和除法等基本算术运算,因为这些运算在计算中占据了主导地位。因此,FLOPs 表示网络中所有浮点运算的总次数。
”flops“ 则是 ”floating-point operations per second“ 的缩写,表示每秒钟可以执行的浮点运算次数,通常用于衡量计算机硬件的性能。它通常被用来比较不同计算机的性能,并且被广泛应用于科学计算、机器学习和其他需要高性能计算的领域。
FLOPs 是一个计算量的指标,而 flops 是一个计算速度的指标。因此,这两个概念虽然有一定的联系,但含义和使用场景不同。在深度学习中,FLOPs 更常用于评估模型的计算量,而 flops 更常用于评估计算机硬件的性能。
精度
精度:指模型在测试集上的表现。在网络剪枝中,我们希望通过去掉一些冗余和不必要的参数,来优化模型的效果。因此,精度是一个很重要的评价指标。在深度学习中,模型精度通常是通过计算模型在测试集上的准确率来评估的。准确率是指模型在测试集上正确分类的样本数与总样本数之比,通常用百分比表示。
具体地,假设测试集包含 个样本,用模型对这 个样本进行预测,预测结果与真实标签一一对应,正确预测的样本数为 ,则模型的准确率为:
准确率
需要注意的是,计算准确率时需要将模型在测试集上的所有预测结果与真实标签一一对应,才能计算出准确率。同时,准确率只能反映模型在测试集上的表现,对于模型的泛化能力、鲁棒性等性能指标并不能完全代表。
除了准确率外,还有其他的模型精度评估指标,例如精确度、召回率、F1 分数等,这些指标通常用于解决不平衡分类或多分类问题,并且需要将模型的预测结果与真实标签之间的关系分成不同的情况进行考虑。由于这些不是网络剪枝的重点内容,具体的计算方式和含义可以参考相应的文献和教程。
剪枝率
剪枝率:指剪枝后剩余的参数量与原始参数量之比。剪枝率是衡量网络剪枝效果的重要指标之一。公式如下:
剪枝率原始参数量剪枝后参数量原始参数量
其中,原始参数量和剪枝后参数量的计算方式同上文所述。剪枝率越高,表示去掉了越多的冗余参数,模型的效果和计算量也会更好。
常用数据集
网络剪枝常用的数据集主要有以下几个:CIFAR-10/100,ImageNet,MNIST数据集。下面是几种数据集的下载和使用方法。
CIFAR-10
CIFAR-10是一个广泛使用的图像分类数据集,包含10个类别的60000张32x32彩色图像。该数据集中每个类别的图像数量相同,即每个类别都有6000张图像。CIFAR-10数据集的10个类别分别为:
CIFAR-10 数据集
-
飞机(airplane)
-
汽车(automobile)
-
鸟类(bird)
-
猫(cat)
-
鹿(deer)
-
狗(dog)
-
青蛙(frog)
-
马(horse)
-
船(ship)
-
卡车(truck)
CIFAR-10数据集被广泛用于测试和比较不同的机器学习算法和模型,尤其是在计算机视觉领域。由于其图像分辨率相对较低,图像大小只有32x32,因此CIFAR-10数据集对于初学者和研究者来说是一个很好的入门数据集。
使用方法:可以使用PyTorch或TensorFlow等深度学习框架中提供的API,加载CIFAR-10数据集并进行训练和测试。在网络剪枝中,可以将CIFAR-10作为训练数据集,在剪枝之前对模型进行训练,然后进行剪枝和微调。
PyTorch 调用方法:
import torchvision.datasets as datasets
trainset = datasets.CIFAR10(root='./data', train=True, download=True)
testset = datasets.CIFAR10(root='./data', train=False, download=True)
TensorFlow 调用方法:
import tensorflow_datasets as tfds
trainset, testset = tfds.load('cifar10', split=['train', 'test'], shuffle_files=True, as_supervised=True)
下载方法:官网:https://www.cs.toronto.edu/~kriz/cifar.html
除了CIFAR-10之外,还有一个与其相关的数据集CIFAR-100,其中包含100个类别的图像,每个类别有600张图像。CIFAR-100数据集的类别更细致,每个类别包含更多种类的物体,如CIFAR-10数据集的类别“鸟类”在CIFAR-100数据集中被分为“鸟类”和“昆虫”两个类别。
ImageNet
ImageNet是一个广泛使用的大规模图像分类数据集,其中包含超过1400万张图像,涵盖超过2万个类别。ImageNet数据集可以用于训练和评估图像分类和目标检测算法和模型。
该数据集是在2009年开始建立的,由斯坦福大学的李飞飞教授领导的研究小组创建,目的是解决计算机视觉领域中一个关键问题,即如何实现大规模图像分类。
ImageNet数据集中的每个类别都具有多张图像,并且每张图像都配有相应的标签。ImageNet数据集的类别非常广泛,包括各种动物、植物、物品、场景等等,如“老虎”、“草原”、“宝石”、“火车”等。数据集中图像分辨率相对较高,通常为几百像素到几千像素不等。这使得ImageNet数据集成为一个非常具有挑战性的数据集,需要使用高效的算法和模型才能对其进行分类和识别。
ImageNet数据集的下载方法如下:
PyTorch:
import torchvision.datasets as datasets
traindir = '/path/to/imagenet/train'
valdir = '/path/to/imagenet/val'
trainset = datasets.ImageFolder(traindir)
testset = datasets.ImageFolder(valdir)
TensorFlow:
import tensorflow_datasets as tfds
trainset, testset = tfds.load('imagenet2012', split=['train', 'validation'], shuffle_files=True, as_supervised=True)
下载地址:官网:http://image-net.org/download
MNIST
MNIST是一个手写数字数据集,包含60000张28x28像素的训练图像和10000张测试图像,用于训练和测试基于图像的机器学习算法和深度学习算法。MNIST是深度学习领域中一个经典的数据集,常被用于测试和验证新的深度学习模型和算法。
使用方法:可以使用PyTorch或TensorFlow等深度学习框架中提供的API,加载MNIST数据集并进行训练和测试。在网络剪枝中,可以将MNIST作为训练数据集,在剪枝之前对模型进行训练,然后进行剪枝和微调。使用方法如下:
PyTorch
import torchvision.datasets as datasets
trainset = datasets.MNIST(root='./data', train=True, download=True)
testset = datasets.MNIST(root='./data', train=False, download=True)
TensorFlow
import tensorflow_datasets as tfds
trainset, testset = tfds.load('mnist', split=['train', 'test'], shuffle_files=True, as_supervised=True)
官网:http://yann.lecun.com/exdb/mnist/
下篇预告
本篇推文我们介绍了网络剪枝任务的评价指标和常用数据集的下载和使用方法,至此关于网络剪枝的基本任务我们已经全部了解。从第三篇文章开始我们将进入专栏的第二部分:剪枝方法的介绍。下篇推文我们将会带领读者深入学习OBD (Optimal Brain Damage) 剪枝方法,以此来探索早期剪枝方法的模样。
欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。
【技术文档】《从零搭建pytorch模型教程》122页PDF下载
QQ交流群:470899183。群内有大佬负责解答大家的日常学习、科研、代码问题。
模型部署交流群:732145323。用于计算机视觉方面的模型部署、高性能计算、优化加速、技术学习等方面的交流。
其它文章
上线一天,4k star | Facebook:Segment Anything
3090单卡5小时,每个人都能训练专属ChatGPT,港科大开源LMFlow
Efficient-HRNet | EfficientNet思想+HRNet技术会不会更强更快呢?
ICLR 2023 | SoftMatch: 实现半监督学习中伪标签的质量和数量的trade-off
目标检测创新:一种基于区域的半监督方法,部分标签即可(附原论文下载)