和大佬学习:
沐风:GoogLeNet V1的计算量和参数量精算表zhuanlan.zhihu.com以及数据量运算,和运算时间。
首先简单介绍下概念
1.前向传播
如上图,首先从一维扩展到了二维。但是有和二维全连接不同的地方是:
- 稀疏连接:说到底。就是本来后隐层的单个神经元应该对所有的 前隐层的做卷积的,但是这里仅仅对卷积核内的前隐层做卷积。所以就有了“单个神经元的卷积过程”这副图
- (一张隐层)共享参数:同一张feature map共享一套参数,包括卷积核和bias。这里做一下假设:
-
: 后隐层的第个隐层
-
,: 分别是隐层中对应神经元的坐标
-
:是后隐层对应的卷积核
-
: 前隐层( 规格为)
-
: 这里是该神经元的偏置
-
: 后隐层的神经元
-
所以有公式如下:
- 这里可以看到,每个前隐层的相同区域由不同的大小为
的核进行卷积,卷积开始的位置由后隐层的神经元位置与决定。
- 参数量:所以此处卷积核的数量为
个,所以参数量为
2.反向传播
2.1 卷积层的反向传播
基本的思路:反向传播的时候要对权重和偏执求偏导数,也就是对卷积核和bias求导。
看的头疼:先放一放,准备别的了。
解释:当然呢,这只是最基本的用来理解卷积的过程。如果是一个完整的过程还需要接下来继续写。这里稍微写一下参数量的计算:
3.卷积神经网络的时间复杂度和空间复杂度的计算
3.1 首先是参数量的计算
每一层的参数量只考虑weight,而不考虑bias。所以参数量为 (
为每一层的隐层数):
3.2 空间复杂度(访存量),严格来讲包括两部分:总参数量 + 各层输出特征图。
-
- 参数量:模型所有带参数的层的权重参数总量(即模型体积,式第一个求和表达式)
- 特征图:模型在实时运行过程中每层所计算出的输出特征图大小(下式第二个求和表达式)
- 总参数量只与卷积核的尺寸
、通道数、层数相关,而与输入数据的大小无关
- 输出特征图的空间占用比较容易,就是其空间尺寸
和通道数的连乘
- 注:实际上有些层(例如 ReLU)其实是可以通过原位运算完成的,此时就不用统计输出特征图这一项了。
3.3 单层时间复杂度
-
:每个卷积核输出特征图的边长
-
:每个卷积核的边长
-
:每个卷积核的通道数,也即输入通道数,也即上一层的输出通道数
-
:本卷积层具有的卷积核个数,也即输出通道数。
- 可见,每个卷积层的时间复杂度由输出特征图面积
、卷积核面积、输入和输出通道数完全决定。
- 其中,输出特征图尺寸本身又由输入矩阵尺寸
、卷积核尺寸、、这四个参数所决定,表示如下:
- 注1:为了简化表达式中的变量个数,这里统一假设输入和卷积核的形状都是正方形。
- 注2:严格来讲每层应该还包含 1 个
参数,这里为了简洁就省略了。
3.4 整体的时间复杂度
-
神经网络所具有的卷积层数,也即网络的深度。
-
:神经网络第个卷积层
-
:神经网络第个卷积层的输出通道数,也即该层的卷积核个数
- 对于第
个卷积层而言,其输入通道数就是第个卷积层的输出通道数。
- 可见,CNN整体的时间复杂度并不神秘,只是所有卷积层的时间复杂度累加而已。
- 简而言之,层内连乘,层间累加。