精华内容
下载资源
问答
  • 卷积神经网络的参数计算

    万次阅读 多人点赞 2018-01-08 22:39:12
    这篇文章会简单写一下卷积神经网络上参数的计算方法,然后计算各个常见神经网络的参数。一个是加强对网络结构的了解,另一方面对网络参数的量级有一个大概的认识,也可以当作备忘录,免得想知道的时候还要再算。 ...

    前言

    这篇文章会简单写一下卷积神经网络上参数的计算方法,然后计算各个常见神经网络的参数。一个是加强对网络结构的了解,另一方面对网络参数的量级有一个大概的认识,也可以当作备忘录,免得想知道的时候还要再算。

    此外,还有个比较有争议的点,评论区里也有人指出,关于全连接中bias(偏置)的计算,我看的一些资料里参数的数量是1,但是在用的深度学习框架中(tensorflow和pytorch)基本都是和输出层的元素的数量相同,我的看法的话,第二种可能效果更好一些吧,这样会有更高的自由度,或许有相关的论文,但是我没发现。不过这一点其实影响不大的,因为bias所占的参数量的比重很小,所以无论用哪种计算方法最终的结果基本没什么差别。

    参数计算方法

    全连接的参数计算就不说了,比较简单。
    首先,简单说一下卷积网络的参数计算。下图中是一个32x32x3的输入,然后用一个5x5x3的卷积对其中某个位置的计算,这里算的是一个点积,所以输出是一个单独的标量的值。

    因为卷积的操作是通过一个滑动窗口实现的,那么通过卷积操作,我们就得到了一个28x28x1的输出。

    如果我有6个上面说的filter,那么,我就会得到一个28x28x6的输出。

    这就是一个最基础的卷积操作,那么这里用到的参数是多少呢?我们只需要把每个filter的参数累加起来,当然,不要忘了加上bias:5x5x3x6 + 6 = 456

    另外一个需要计算的就是进行卷积以后的输出的大小,从下面的图上看就很好理解了,用公式直接算就好了。其中N是输入图像的size,F是filter的size,stride是滑动的步长。

    然后从上图中最后一个例子可以看到,stride大于1的时候不一定能整除,这个时候,就需要在原图像上加上一层padding层,这样图像的大小就变化了,然后再用前面的公式算就行了。

    然后还有一个maxpooling操作,这个会改变输入输出,但是不会有参数。所以使用和计算卷积一样的公式算就行了。

    LeNet

    首先计算一下最简单的LeNet。网络结构如下:

    网络层(操作) 输入 filter stride padding 输出 计算公式 参数量
    Input 32x32x1 32x32x1 0
    Conv1 32x32x1 5x5x6 1 0 28x28x6 5x5x1x6+6 156
    MaxPool1 28x28x6 2x2 2 0 14x14x6 0
    Conv2 14x14x6 5x5x16 1 0 10x10x16 5x5x6x16+16 2416
    MaxPool2 10x10x16 2x2 2 0 5x5x16 0
    FC1 5x5x16 120 5x5x16x120+1 48001
    FC2 120 84 120x84+1 10081
    FC3 84 10 84x10+1 841

    参数总量: 61495
    参数内存消耗: 240.214KB

    AlexNet

    Alexnet的结构图有些奇怪。但其实是因为要把网络拆分到两个GPU上,才画成了两层,两层的结构是一样的,下面计算的时候的结构相当于合并以后的网络。

    网络层(操作) 输入 filter stride padding 输出 计算公式 参数量
    Input 227x227x3 227x227x3 0
    Conv1 227x227x3 11x11x96 4 0 55x55x96 11x11x3x96+96 34944
    MaxPool1 55x55x96 3x3 2 0 27x27x96 0
    Norm1 27x27x96 27x27x96 0
    Conv2 27x27x96 5x5x256 1 2 27x27x256 5x5x96x256+256 614656
    MaxPool2 27x27x256 3x3 2 0 13x13x256 0
    Norml2 13x13x256 13x13x256 0
    Conv3 13x13x256 3x3x384 1 1 13x13x384 3x3x256x384+384 885120
    Conv4 13x13x384 3x3x384 1 1 13x13x384 3x3x384x384+384 1327488
    Conv5 13x13x384 3x3x256 1 1 13x13x256 3x3x384x256+256 884992
    MaxPool3 13x13x256 3x3 2 0 6x6x256 0
    FC6 6x6x256 4096 6x6x256x4096+1 37748737
    FC7 4096 4096 4096x4096+1 16777217
    FC8 4096 1000 4096x1000+1 4096001

    参数总量: 62369155
    参数内存消耗: 237.9195MB

    VGG

    VGG常见有16层和19层的,这里以16层为例,下面是模型结构图。

    网络层(操作) 输入 filter stride padding 输出 计算公式 参数量
    Input 224x224x3 224x224x3 0
    Conv3-64 224x224x3 3x3x64 1 1 224x224x64 3x3x3x64 + 64 1792
    Conv3-64 224x224x64 3x3x64 1 1 224x224x64 3x3x64x64 + 64 36928
    MaxPool2 224x224x64 2x2 2 0 112x112x64 0
    Conv3-128 112x112x64 3x3x128 1 1 112x112x128 3x3x64x128 + 128 73856
    Conv3-128 112x112x128 3x3x128 1 1 112x112x128 3x3x128x128 + 128 147584
    MaxPool2 112x112x128 2x2 2 0 56x56x128 0
    Conv3-256 56x56x128 3x3x256 1 1 56x56x256 3x3x128x256 + 256 295168
    Conv3-256 56x56x256 3x3x256 1 1 56x56x256 3x3x256x256 + 256 590080
    Conv3-256 56x56x256 3x3x256 1 1 56x56x256 3x3x256x256 + 256 590080
    MaxPool2 56x56x256 2x2 2 0 28x28x256 0
    Conv3-512 28x28x256 3x3x512 1 1 28x28x512 3x3x256x512 + 512 1180160
    Conv3-512 28x28x512 3x3x512 1 1 28x28x512 3x3x512x512 + 512 2359808
    Conv3-512 28x28x512 3x3x512 1 1 28x28x512 3x3x512x512 + 512 2359808
    MaxPool2 28x28x512 2x2 2 0 14x14x512 0
    Conv3-512 14x14x512 3x3x512 1 1 14x14x512 3x3x512x512 + 512 2359808
    Conv3-512 14x14x512 3x3x512 1 1 14x14x512 3x3x512x512 + 512 2359808
    Conv3-512 14x14x512 3x3x512 1 1 14x14x512 3x3x512x512 + 512 2359808
    MaxPool2 14x14x512 2x2 2 0 7x7x512 0
    FC1 7x7x512 4096 7x7x512x4096 + 1 102760449
    FC2 4096 4096 4096*4096 + 1 16777217
    FC3 4096 1000 4096*1000 + 1 4096001

    参数总量: 138357544 138348355
    参数内存消耗: 527.7570MB

    GoogleNet

    googlenet 提出了inception的概念,用于增加网络深度和宽度,提高深度神经网络性能。下面是googlenet的网络结构:

    inception的结构如下:

    可以看出,inception的结构是多个卷积堆叠,组合而成的。

    还有,从上面的网络结构中,可以看到一共有三个输出的分类层:

    这个是为了解决深层网络训练的时候梯度消失的问题,所以在中间加入了几个全连接层辅助训练。
    最后,贴一个论文上给出的模型的结构图:

    在这个图上,已经给出了参数的数量和使用的内存,不过我还是说一下inception模块的计算方法和一些注意事项。

    1. 首先是输入,输入的size应该为224x224x3
    2. 注意第一层的卷积,没有注明padding,直接算的话,结果是不对的,这里的padding计算方法和tensorflow中卷积方法padding参数设置为’SAME’是一样的。简单来说,就是ceil(size/kernel_size),这个对于下面的计算也是一样的,总之,就是要填适当的0,使得输出结果和上图相对应就是了。
      3.在上图中5~10列对应inception module中的各个卷积操作,对应的值是输出的feature的数量,对于maxpool操作,他的padding为2,stride为1。
      4.当一个inception模块计算完后,它的输出为各个卷积操作输出的结果连接起来,也就是如果输出分别为28x28x64、28x28x128、28x28x32、28x28x32,那么最终输出就是28x28x(63+128+32+32)。

    下面的图给出了inception module内部计算的输出结果。

    可以看出googlenet的参数量要比vgg少很多,但是效果确更优秀。

    Resnet

    关于resnet,我就不打算计算参数了,因为实在量很大,而且实际上,resnet的基本结构也比较简单,计算方法和前面的没什么差别。这里就简单贴一下结构图好了。

    可以看出来,如果没有中间一条条连线,其实就是一个很深的普通的卷积网络,中间的连线可以保证梯度可以传递到低层,防止梯度消失的问题。

    展开全文
  • 卷积神经网络 模仿 视觉原理 III . 卷积神经网络简介 IV . 卷积神经网络 组成 V . 卷积神经网络 工作流程 VI . 降低样本参数数量级 VII . 卷积计算 图示分析 VIII . 卷积计算 简介 IX . 卷积计算 示例 X . 卷积本质...



    I . 人类的视觉原理



    1 . 深度学习 与 大脑认知 :


    ① 深度学习基础 : 大脑对外界事务的认知原理 , 是很多深度学习算法的基础 , 这里讨论人类的视觉原理 ,

    ② 视觉原理 : 视觉识别信息处理过程 , 是由可视皮层完成的 , 并且可视皮层是分级的 ;

    ③ 卷积神经网络来源 : 卷积神经网络 受 人类视觉原理启发 , 而开发出来的 ;


    2 . 视觉原理 与 可视皮层 分层 :


    ① 信号输入 : 视觉输入原始信号 , 即大脑从瞳孔中摄入一张由像素值组成的图片 ;

    ② 识别边缘 ( 可视皮层 底层 ) : 将输入的像素值 , 进行 初步处理 , 识别像素的 边缘 , 方向 信息 ;

    ③ 识别形状 ( 可视皮层 中层 ) : 将 边缘信息 抽象成 形状信息 , 如圆形 , 方形等 ;

    ④ 判定类别 ( 可视皮层 上层 ) : 在上述识别形状的基础上 , 判定该形状是什么类型的事务 , 如桌子 , 汽车等 ;



    II . 卷积神经网络 模仿 视觉原理



    卷积神经网络 原理 :


    ① 模拟视觉原理 : 人类视觉识别涉及到了 不同层级 的可视皮层 , 每层分别处理不同的事务 ;

    ② 构建多层神经网络模型 : 模仿上述分层的课视频曾 , 创建多层神经网络模型 , 如 卷积神经网络 ;

    ③ 分层工作机制 : 多层神经网络模型机制 , 在底层识别图像的边缘特征 , 上一层逐渐识别形状 , 最上层对图像像素进行判定分类 ;



    III . 卷积神经网络简介



    卷积神经网络 简介 :


    ① CNN 卷积神经网络 处理的数据类型 : CNN 卷积神经网络 , 是特殊的神经网络 , 其通常用于处理网格状的数据 , 如 时间序列 ( 音频数据 ) , 或 图片数据 ;

    ② CNN 适用场景 : CNN 卷积神经网络其本质是一个多层神经网络 , 该模型适合处理 大型图像 相关的 机器学习 问题 ;

    ③ CNN 成就 : CNN 在 深度神经网络 中是应用最早 , 最成功的的领域 ;

    ④ CNN 的计算 : 卷积神经网络其本质还是 神经网络 , 其基本的计算由 矩阵相乘 变成了 卷积 ;

    ⑤ CNN 处理图像原理 : 处理大型图像时 , 将图像识别问题 降维处理 , 从底层向高层 , 不断抽取特征时 , 其维度越降越低 , 最终将其变成可训练的模型 ;



    IV . 卷积神经网络 组成



    卷积神经网络 构成 :


    ① 组成 : 卷积神经网络由 卷积层 , 池化层 , 全连接层 , 组成 ;

    ② 卷积组 : 卷积层 与 池化层 , 配对组合 , 即 11 个卷积 + 11 个池化 , 组成 11 个卷积组 ; 整个卷积神经网络中有多个卷积组 ;

    ③ 工作机制 : 按照上述分层 , 逐层提取数据 ( 图像 ) 特征 , 这些特征通过全连接层结合起来 , 完成最终的分类判定操作 ;



    V . 卷积神经网络 工作流程



    卷积神经网络 工作流程 :


    ① 卷积 : 通过卷积 模拟 特征 ;

    ② 池化 : 通过卷积的 权值 共享 , 池化 , 可以降低整体网络的参数数量级 ;

    ③ 连接分类 : 上述 卷积 池化 后的结果通过传统的 神经网络 进行分类即可 ;



    VI . 降低样本参数数量级



    1 . 传统神经网络分析图片 : 使用 传统神经网络 分析一张图片 , 如果该图片有 100100 万 像素 , 那么需要将每个像素值都作为一个属性值输入到神经网络中 , 那么其隐藏层有 100100 万神经元单元 , 如果这样的图片有几万张 , 这个数量级太复杂 ;


    2 . 卷积神经网络 减少参数数量级 原理 :


    ① 底层特征局部性 : 图像的最底层的特征都是局部性的 , 使用一个小的过滤器 , 10×1010 \times 10 像素 , 就可以将图像的 边缘 特征表示出来 ; 边缘底层特征是 横向 , 垂直 , 斜线 , 等边缘 形状特征 ;

    ② 图像特征类似 : 图像中的特征 , 不管是相同图像 , 还是不同图像 , 其中的片段的特征是类似的 , 可以使用 同一组分类器 描述 不同的图像 特征 ; 如训练识别一只猫的图像 , 在这张图片上的猫 , 与另外一张图片的猫 , 其片段特征的是类似的 ;

    ③ 降低数量级 : 100100 万像素的图片 , 可以使用 11 万个 10×1010 \times 10 像素 的过滤器 , 描述图片底部的特征 ;



    VII . 卷积计算 图示分析



    1 . 原始输入 与 卷积核 :


    ① 原始输入 : 需要识别的图像 ;

    ② 卷积核 : 可以看做是滑动窗口 , 在图像上滑动 ;

    在这里插入图片描述


    2 . 第 11 次卷积 : {a,b,e,f}\{a , b , e , f \} 与 卷积核 {w,x,y,z}\{w, x, y , z\} 进行卷积 计算 : 如下图 , 对应位置的值相乘 , 然后将 44 个乘积相加 , 这个操作表示一次卷积运算 , 结果是 (aw+bx+ey+fz)( aw + bx + ey + fz ) ;

    在这里插入图片描述


    3 . 第 22 次卷积 :{b,c,f,g}\{b,c,f,g \} 与 卷积核 {w,x,y,z}\{w, x, y , z\} 进行卷积 计算 : 如下图 , 对应位置的值相乘 , 然后将 44 个乘积相加 , 这个操作表示一次卷积运算 , 结果是 (wb+xc+yf+zg)( wb + xc + yf + zg ) ;

    在这里插入图片描述


    4 . 第 33 次卷积 :{c,d,g,h}\{c,d,g,h\} 与 卷积核 {w,x,y,z}\{w, x, y , z\} 进行卷积 计算 : 如下图 , 对应位置的值相乘 , 然后将 44 个乘积相加 , 这个操作表示一次卷积运算 , 结果是 (wc+xd+yg+zh)( wc + xd + yg + zh ) ;

    在这里插入图片描述


    5 . 第 44 次卷积 :{e,f,i,j}\{e , f,i,j \} 与 卷积核 {w,x,y,z}\{w, x, y , z\} 进行卷积 计算 : 如下图 , 对应位置的值相乘 , 然后将 44 个乘积相加 , 这个操作表示一次卷积运算 , 结果是 (we+xf+yi+zj)( we + xf + yi + zj ) ;

    在这里插入图片描述


    6 . 第 55 次卷积 :{f,g,j,k}\{f,g,j,k\} 与 卷积核 {w,x,y,z}\{w, x, y , z\} 进行卷积 计算 : 如下图 , 对应位置的值相乘 , 然后将 44 个乘积相加 , 这个操作表示一次卷积运算 , 结果是 (wf+xg+yj+zk)( wf + xg + yj + zk ) ;

    在这里插入图片描述


    7 . 第 66 次卷积 :{g,h,k,l}\{g,h,k,l \} 与 卷积核 {w,x,y,z}\{w, x, y , z\} 进行卷积 计算 : 如下图 , 对应位置的值相乘 , 然后将 44 个乘积相加 , 这个操作表示一次卷积运算 , 结果是 (wg+xh+yk+zl)( wg + xh + yk + zl ) ;

    在这里插入图片描述


    8 . 卷积结如下 : 变成了一个 2×32 \times 3 的图像 ;

    在这里插入图片描述


    9 . 卷积效果 :


    ① 卷积 结果 : 原来的输入图像是 3×43 \times 4 像素 , 经过卷积后 , 变成了 2×32 \times 3 的图像 ;

    ② 效果 : 维度降低了 , 参数变少了 ;

    ③ 卷积核维度 : 如果使用 3×33 \times 3 的卷积核 , 那么维度降低的更多 ;



    VIII . 卷积计算 简介



    1 . 卷积计算 :


    ① 输入图 : 要分析的图片 , 又叫做特征图 ;

    ② 卷积核 :大小是固定的 , 用于扫描输入图 ; 可以由学习得到 , 也可以使用事先设计好的卷积核 ;

    ③ 内积运算 : 就是所有对应元素相乘 , 然后求和的结果 ;

    ③ 卷积计算过程 : 使用卷积核 扫描 输入图 , 如上示例 , 将扫描到的 输入图的部分内容 , 与卷积核的内容 , 进行内积运算 ;


    2 . 常用的卷积核 :


    ① 常用卷积核 1 :

    0 0 0
    0 0 0
    0 0 0

    ② 常用卷积核 2 :

    -1 -1 -1
    0 0 0
    1 1 1

    ③ 常用卷积核 3 :

    -1 0 1
    -1 0 1
    -1 0 1


    IX . 卷积计算 示例



    计算图中的最后两个空白位置的卷积 :

    在这里插入图片描述
    输入图是 5×55\times 5 的 , 卷积核是 3×33 \times 3 的 ;

    黄色部分是卷积核为 : [101010101]\begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{bmatrix}


    卷积计算过程如下 :


    ① 第 33 行第 22 列 卷积结果 : 卷积核 [101010101]\begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{bmatrix}[011010110]\begin{bmatrix} 0 & 1 & 1 \\ 0 & 1 & 0 \\ 1 & 1 & 0 \end{bmatrix} 进行卷积运算 , 如下 :

    (1×0)+(0×1)+(1×1)+(0×0)+(1×1)+(0×0)+(1×1)+(0×1)+(1×0)=3(1 \times 0 ) + (0 \times 1 ) + (1 \times 1 ) + \\\\ (0 \times 0 ) + (1 \times 1) + (0 \times 0 ) + \\\\ (1 \times 1 ) + (0 \times 1) + (1 \times 0) = 3


    ② 第 33 行第 33 列 卷积结果 : 卷积核 [101010101]\begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{bmatrix}[111110100]\begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 0 \\ 1 & 0 & 0 \end{bmatrix} 进行卷积运算 , 如下 :

    (1×1)+(0×1)+(1×1)+(0×1)+(1×1)+(0×0)+(1×1)+(0×0)+(1×0)=4(1 \times 1 ) + (0 \times 1 ) + (1 \times 1 ) + \\\\ (0 \times 1 ) + (1 \times 1) + (0 \times 0 ) + \\\\ (1 \times 1 ) + (0 \times 0) + (1 \times 0) = 4



    X . 卷积本质



    1 . 卷积 及 卷积核 本质 :


    ① 卷积核本质 : 卷积核的本质相当于一个过滤器 , 可以过滤识别图像的各个区域的特征 , 获取这些区域的特征值 ;

    ② 卷积核来源 : 卷积核一般是在学习训练过程中得到的 ;

    ③ 卷积结果的意义 : 每个卷积核代表了一种图像的特征模式 , 如果某个区域与该卷积核 进行内积运算 , 卷积出的值很大 , 说明该区域与该卷积核图像类似 ;

    ④ 多个卷积核 : 在实际使用中 , 一个卷积神经网络 , 可能会有多个卷积核 ;



    2 . 卷积核底层纹理 :


    ① 底层纹理模式 : 如果有 nn 个卷积核 , 可以理解为该图像有 nn 种底层的纹理模式 , 使用这些纹理模式的特征可以绘制出一幅图像 , 也能从一堆杂乱的图像中识别出该图像 ;


    ② 底层纹理示例 : 下图是常用的 2424 种卷积核 , 也就是 2424 种底层纹理模式 ; 如 第 44 行 , 第 22 列 , 三条垂直的线 , 亮线表示 1 , 暗线表示 0 , 因此可以使用卷积核 [100100100]\begin{bmatrix} 1 & 0 & 0 \\ 1 & 0 & 0 \\ 1 & 0 & 0 \end{bmatrix} 表示 , 该纹理 , 最左侧是亮的 , 右边两个是暗的 ;
    在这里插入图片描述



    XI . 卷积 计算 参数



    1 . 通道数 : 卷积核的个数 ;


    ① 输入通道数 : 上一层输出的通道数量 , 即卷积核的个数 ;

    ② 输出通道数 : 本层输出的通道数量 , 即卷积核的个数 ;


    2 . 卷积核大小 :


    ① 卷积核大小关联性 : 与卷积计算后 , 每个卷积结果输出值 , 与多大范围的输入图像有关 , 即上面说的过滤器大小 , 底层纹理大小 , 滑动窗口大小 ;

    ② 建议取值 : 建议使用奇数大小 , 这样能保证卷积计算后 , 有唯一的一个中心点 ;

    ③ 卷积核效果 : 卷积核 越大 , 分类效果越好 ;

    ④ 卷积核参数数量 : 卷积核增大 , 其参数就会指数级增加 , 参数个数是卷积核的平方 , 即进行内积运算的参数个数 ; 如卷积核为 33 , 那么参数有 99 个 , 卷积核为 55 , 参数有 2525 个 ;


    3 . 填充 : 不想降维 , 先将输入图 对称 补 00 , 然后进行滑动窗口 , 卷积计算 ;


    ① 降低维度 : 卷积之后 , 不想降维 , 如前面的 5×55 \times 5 的输入图 , 使用 3×33 \times 3 卷积核 , 卷积之后变成了 3×33 \times 3 的图像 , 这里就将输入图的维度下降了 ;

    ② 对称补 00 : 如果不想降低输入图的维度 , 可以使用填充 , 即先在周边位置使用 00 补充 , 注意对称补充 , 不要在一个边上补 00 , 然后再进行卷积计算 ;


    4 . 步长 : 每次卷积核的移动距离 ( 单位 : 像素 ) , 即 每次移动滑动窗口 ( 卷积核 ) 的距离 , 单位是像素 , 之前的两个例子都是每次移动一个像素值 ;

    展开全文
  • 卷积神经网络的参数计算 from_https://www.cnblogs.com/hejunlin1992/p/7624807.html 举例1:  比如输入是一个32x32x3的图像,3表示RGB三通道,每个filter/kernel是5x5x3,一个卷积核产生一个feature map,下...
    卷积神经网络中的参数计算  from_https://www.cnblogs.com/hejunlin1992/p/7624807.html

    举例1:

      比如输入是一个32x32x3的图像,3表示RGB三通道,每个filter/kernel是5x5x3,一个卷积核产生一个feature map,下图中,有6个5x5x3的卷积核,故输出6个feature map(activation map),大小即为28x28x6。

           下图中,第二层到第三层,其中每个卷积核大小为5x5x6,这里的6就是28x28x6中的6,两者需要相同,即每个卷积核的“层数”需要与输入的“层数”一致。有几个卷积核,就输出几个feature map,下图中,与第二层作卷积的卷积核有10个,故输出的第三层有10个通道。

    举例2:

      NxN大小的输入(暂时不考虑通道数),与FxF大小的卷积核(暂时不考虑个数)做卷积,那么输出大小为多大?计算公式为:(N - F) / stride + 1,其中stride为做卷积是相邻卷积核的距离。

    举例3:

      当输入为7x7大小,卷积核为3x3,stride=1,在7x7周围补上一圈0(pad=1个像素),那么输出大小为多大?

    是7x7。

    举例3:

           输入为32x32x3,卷积核大小为5x5,总共有10个卷积核,做卷积的时候stride=1,pad=2,那么这一层总共含有多少参数?

           每个卷积核含有的参数个数为:5*5*3 + 1 = 76,其中1是偏置bias,由于有10个卷积核,故总参数为76*10=760。

    总结:

    其中,卷积核的数量K一般是2的整数次幂,这是因为计算方便(计算机计算2^n比较快)

     

     

    关于池化层的参数计算:

     

    参考:

    斯坦福大学CS231N课程PPT

    http://cs231n.stanford.edu/slides/2016/winter1516_lecture7.pdf

    转载于:https://www.cnblogs.com/wanghuadongsharer/p/9577244.html

    展开全文
  • 卷积神经网络的参数量和计算

    千次阅读 2020-11-26 18:37:34
    卷积神经网络的参数量和计算量》   写点重要的东西 Key Words:Parameters count、FLOPS、FLOPs Beijing, 2020 作者:RaySue Agile Pioneer   文章目录模型的参数量全连接参数量池化层Vanilla Conv ...

    《卷积神经网络的参数量和计算量》

      对于在端部署的模型来说,模型的参数量以及计算量是锱铢必较的,使用什么样的激活函数,会有多大的计算成本。对于模型的压缩量化等都是模型的参数量和计算量的准确计量为基础的,所以本文简单记录一下常见神经网络的参数量和计算量。

    Key Words:Parameters count、FLOPS、FLOPs


    Beijing, 2020

    作者:RaySue

    Agile Pioneer  


    • FLOPS (Floating point of per Second) 的缩写,意指每秒浮点运算次数。用来衡量硬件的性能。

    • FLOPs (Floating point of operations) 的缩写,是浮点运算次数,可以用来衡量算法/模型复杂度。


    模型的参数量

    • KhK_h 卷积核的高度
    • KwK_w 卷积核的宽度
    • CinC_{in} 输入featureMap的channel数
    • CoutC_{out} 输出featureMap的channel数

    全连接参数量

      全连接层的参数量是很大的,和输入的隐藏层的数据大小相关,如VGG-16最后一次卷积得到的feature map的维度为:7x7x512,将feature map展开后输出为4096个隐藏层单元,那么相当于用4096个1x1的卷积对7x7x512展平的结果去做卷积。
    参数量:

    7×7×512×4096=1027604487 \times 7 \times 512 \times 4096 = 102760448

    一个亿的参数量,所以全连接层参数是冗余的。


    池化层

      对于池化层而言,常用的Max-pooling,Avg-pooling等是不存在参数量的。


    Vanilla Conv Parameters

       对于某一个卷积层,它的parameters个数为:

    (KhKwCin)Cout+Cout(K_h * K_w * C_{in}) * C_{out} + C_{out}


    Group Convolution

       分组卷积的输出特征图的每个通道,只和输入特征图的一部分通道有关,而这部分通道,就是一个分组(Group)。依旧假设输入特征图的尺寸为CinHWC_{in} * H * W,分为 gg 组进行分组卷积,那么,对于每一组,输出特征图的通道数都是 Coutg\frac{C_{out}}{g}每组的卷积核参数变为:

    CingKhKwCoutg\frac{C_{in}}{g} * K_h * K_w * \frac{C_{out}}{g}

    最后只需要将各个分组的计算结果按照通道进行连接(Cat)即可,每组的参数量和普通卷积一样,一共g组则总体的参数量为:

    CingKhKwCoutgg\frac{C_{in}}{g} * K_h * K_w * \frac{C_{out}}{g} * g

    参数量减少为普通卷积的1/g1 / g


    Depthwise Separable Convolution

       对于深度可分离卷积,包含两个部分,Depthwise和Point_wise。

    Depthwise:

    KhKwCinK_h * K_w * C_{in}

    Pointwise:

    11CinCout1 * 1 * C_{in} * C_{out}

    final:

    KhKwCin+11CinCoutK_h * K_w * C_{in} + 1 * 1 * C_{in} * C_{out}

    深度可分离卷积比普通卷积:

    KhKwCin+CinCout(KhKwCin)Cout+Cout=1Cout+1KhKw\frac{K_h * K_w * C_{in} + C_{in} * C_{out}}{(K_h * K_w * C_{in}) * C_{out} + C_{out}} = \frac{1}{C_{out}} +\frac{1}{K_h * K_w}

       为了便于理解、便于和分组卷积类比,假设Cin=CoutC_{in} = C_{out}。深度卷积其实就是$g = C_{in} = C_{out} $的分组卷积,只不过没有直接将 gg 组结果拼接,所以Depthwise卷积参数量是标准卷积的1Cout\frac{1}{C_{out}},而Pointwise卷积的参数量是标注卷积的 1KhKw\frac{1}{K_h * K_w}


    模型的计算量

    • FLOPS 注意全部大写 是floating point of per Second 的缩写,意指每秒浮点运算次数。用来衡量硬件的性能。
    • FLOPs 是floating point of operations的缩写,是浮点运算次数,可以用来衡量算法/模型复杂度。
    • MAC或MACC或MADD(Multiply And Accumulate)乘累加单元
    • 1 MAC = 2 FLOPs 2 * (卷积乘法 + 卷积乘法自后所有数相加 - 1)(n个数相加只需要n-1次相加,所以无bias -1,有bias +1抵消)细节
    • 运算量乘以的图像feature map的维度是 Output feature map的维度
    • 加、减、乘、除、指数运算、平方根、最大值…都是一个FLOP

    卷积运算量(FLOPs)

    Vanilla Conv

    不考虑bias:

    FLOPs=[KhKwCin)+(KhKwCin1]HoutWoutCoutFLOPs =[(K_h * K_w * C_{in}) + (K_h * K_w * C_{in} - 1)]* H_{out} * W_{out} * C_{out}

    上式中,把卷积计算分为两个部分,一部分表示乘法,一部分表示加法,加法只需n-1次

    考虑bias:

    FLOPs=2KhKwCinHoutWoutCoutFLOPs =(2 * K_h * K_w * C_{in})* H_{out} * W_{out} * C_{out}

    公式:

    • 参数量 x 输出的特征映射图的 H,W,其他卷积一样可以这样运算

    全连接层

    不考虑bias:

    FLOPs=(2×I1)×OFLOPs = (2 \times I - 1) \times O

    • which II = input neuron numbers, OO = output neuron numbers
    • 同样的 II 表示乘法 I1I - 1表示加法

    池化层

    ps: 自己的理解

    最大池化

    最大池化,只有一个单个操作,取最大值,所以FLOPs如下:

    HoutWoutH_{out} * W_{out}

    平均池化

    平均池化,对池化步长 SS 区域内的所有隐藏节点进行相加,再做一次除法,FLOPs如下:

    (ShSw1+1)HoutWout(S_h * S_w - 1 + 1) * H_{out} * W_{out}

    激活层

       神经网络中是一定存在非线性的激活函数的,比如ReLU或Sigmoid等,当然这些激活函数也是需要时间来计算的,但是由于激活函数一般没有乘法,所以不计算MAC只计算FLOPs


    ReLU/PReLU/ELU

    只有一个单个操作,取最大值,所以FLOPs如下:

    FLOPs=Hout×Wout×CoutFLOPs = H_{out} \times W_{out} \times C_{out}


    Sigmoid

      在计算FLOPS的时候,我们通常计算加、减、乘、除、指数、平方根等等,作为一个单个的FLOP。因此在Sigmoid中有4个明显的操作,0-x, exp(x), 1 + x, 1 / x

    y=11+exp(x)y = \frac{1}{1 + exp(-x)}

    FLOPs:

    FLOPs=Hout×Wout×Cout×4FLOPs = H_{out} \times W_{out} \times C_{out} \times 4

    实际上不会计算激活函数的计算量的,因为和神经网络的大量乘加运算相比,它占的比例微不足道。所以 we’ll simply assume that the activation function is free.


    设备FLOPS参考




    以ResNet18为例计算FLOPs

    • 公式:HoutWoutKwKhCinCoutH_{out} * W_{out} * K_w * K_h * C_{in} * C_{out} (注意:不要忘了resnet的shortcut的add操作)

    • conv111211277364conv1:112*112*7*7*3*64

    • conv2x565664649+565664649+56566464conv2x:56*56*64*64*9+56*56*64*64*9+56*56*64*64

    • conv3x2828641289+28281281289+282864128conv3x:28*28*64*128*9+28*28*128*128*9+28*28*64*128

    • conv4x14141282569+14142562569+1414128256conv4x:14*14*128*256*9+14*14*256*256*9+14*14*128*256

    • conv5x772565129+775125129+77256512conv5x:7*7*256*512*9+7*7*512*512*9+7*7*256*512

    • fc5121000fc:512*1000

    总共加起来乘以2,为1.8G flops


    参考

    https://www.pianshen.com/article/5383315087/
    https://zhuanlan.zhihu.com/p/65377955
    https://zhuanlan.zhihu.com/p/77471991?utm_source=wechat_timeline
    https://www.zhihu.com/question/65305385
    https://blog.csdn.net/zjucor/article/details/85239860
    https://www.zhihu.com/question/65305385

    展开全文
  • 从keras中运行卷积神经网络我们调用model.summary()会发现所定义卷积神经网络的参数情况。 我们写这样一个卷积网络: from keras import models from keras import layers model = models.Sequential() model.add...
  • 卷积神经网络的参数

    2021-05-28 16:41:26
    卷积神经网络的参数书写一、卷积神经网络所需要的参数二、用神经单元误差δjl\delta _{j}^{l}δjl​来表示各参数梯度分量三、如何计算输出层的δjl\delta _{j}^{l}δjl​ 误差方向传播法师为了应对偏导数计算量巨大...
  • 假设卷积核的大小为 k*k, 输入channel为M, 输出channel为N。 (1)bias为True时: 则参数数量为:k×k×M×N + ...(3)当使用BN时,还有两个可学习的参数α和β,参数量均为N 则参数数量为:k×k×M×N + 3×N ...
  • 卷积神经网络的参数位于卷积层和全连接层,其中一个全连接层要比卷积层多好多参数。 显存占用 显存占用主要是模型(卷积层和全连接层的参数所占的显存)和各层的输出所占的显存。 下面以VGG16为例来讲解。 各层的具体...
  • 计算卷积神经网络参数

    千次阅读 2019-06-14 17:55:17
    卷积神经网络的参数包含:卷积层的权重和偏置,全连接层的权重和偏置 全连接层参数量 在计算参数量前,先了解卷积计算过程。如下图,给定的图像尺寸是32x32x3(高,宽,深度)。对这张图像进行卷积,需要卷积核与...
  • 问题1:给题目假如你用全连接层处理一张256 x256彩色(RGB)图像,输出包含1000个神经元,在使用偏置情况下,参数数量是?怎么算? 全连接层:全连接层每一个结点都与上一层所有结点相连,用来把前边提取到...
  • 卷积神经网络参数量和计算的计算:https://blog.csdn.net/liuweiyuxiang/article/details/99637649
  • 1. 简要计算 卷积层:W2 = (W1 - F + 2P) / ...其中:W2和H2为卷积后特征图宽和高,F为卷积尺寸,P为padding,即图像加零厚度,S为stride即每次移动距离,K为卷积个数。 2. 详细 举例1:  比如...
  • 本文是对卷积神经网络模型参数量和浮点运算量的计算推导公式和方法:
  • 每次一加载模型GPU显存就疯狂增加,看了卷积神经网络参数的计算与模型占用显存的计算原理才知道原因。之前还一直怀疑自己写有bug。 感谢https://www.jianshu.com/p/b8d48c99a47c分享。 下面是我自己结合...
  • 设定简单的卷积神经网络,只有一个卷积层和一个全连接层。 卷积层为6个3×3卷积核 输入图片为大小为1×1×32×32 从代码角度来理解: class Net(nn.Module): def __init__(self): # nn.Module子类函数必须...
  • 如果卷积核尺寸是K×KK\times KK×K,有NNN个特征图作为输入,...在上述情况下,卷积神经网络一次前向传播需要乘法运算次数为: R×C×M×N×K×KR\times C\times M\times N\times K\times KR×C×M×N×K×K ...
  • 卷积神经网络参数如何计算

    千次阅读 多人点赞 2018-07-10 15:32:45
    最近调完实验后,下一步就要进行调参和调网络的工作,所以就准备在这个时间深入地了解一下。主要针对conv层、全连接层、pooling层,另外稍带介绍了CNN中的激活函数Relu。文章主要参考了零基础入门深度学习(4)中的...
  • 一、卷积神经网络参数计算 CNN一个牛逼的地方就在于通过感受野和权值共享减少了神经网络需要训练的参数的个数,所谓权值共享就是同一个Feature Map中神经元权值共享,该Feature Map中的所有神经元使用同一个权值。...
  • 卷积神经网络中卷积层的参数设置与卷积核的大小还有数目有关。具体数目为:卷积核size×卷积核size×均积核的channel数目×卷积核的数目×bias(卷积核数目); 全连接层的参数数目为:imput的matrix特征数目*全连接层...
  • 以前一直对卷积的通道运算有一个误解,今天搞懂了,记录一下。 其实很简单,产生一个输出通道需要与输入通道数相当的卷积模板数(这个为一组产生一个输出通道),如下图所示 对应的卷积模板处理对应输入通道,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,363
精华内容 545
关键字:

卷积神经网络的参数计算