一个卷积神经网络(CNN)中包含的张量大小和参数个数的计算

本篇文章来自于learnopencv.com/number-of-parameters-and-tensor-sizes-in-convolutional-neural-network/感谢原作者的详细讲解。本人增加一些白话进行补充说明,高手请绕行。~-~ 

在这篇文章中,我们分享了一些公式来计算张量(图像)的大小和卷积神经网络(CNN)中每一层的参数个数。 此帖子不定义CNN中使用的基本术语,并假定您熟悉它们。在这篇文章中,Tensor一词仅仅是指具有任意数量通道的图像。 我们将以AlexNet为例展示计算结果。因此,这里是AlexNet的架构,供参考。

AlexNet有以下几层

1、输入层:大小为227x227x3的彩色图像。AlexNet的论文提到了224×224的输入大小,但这是论文中的一个书写错误。

2、卷积层1:由96个尺寸为11×11的卷积核组成,步长为4,填充为0。

3、最大池化层1:由3×3和步长2组成。

4、卷积层2:由256个大小为5×5的卷积核组成,步长为1,填充为2。

5、最大池化层2:由3×3和步长2组成。

6、卷积层3:由384个大小为3×3的卷积核组成,步长为1,填充为1。

7、卷积层4:卷积层4与卷积层3具有相同的结构。它由384个大小为3×3的内核组成,步长为1,填充为1。

8、卷积层5:由256个大小为3×3的内核组成,步长为1,填充为1。

9、最大池化层3:由3×3和步长2组成。

10、全连接层1:第一个完全连接层有4096个神经元。

11、全连接层2:第二个完全连接层有4096个神经元。

12、全连接层3:第三个完全连接层有1000个神经元。

接下来,我们将用上面的架构来解释

1、如何计算每个阶段的张量大小

2、如何计算网络中的参数总数

卷积层输出张量(图像)的大小

我们来定义一下

O = 输出图像的大小(此处指宽度)

I = 输入图像的大小(此处指宽度)。

K = 卷积层中使用的卷积核的大小(此处指宽度)。

N = 卷积核个数。

S = 卷积运算的步长。

P = 填充个数。

输出图像的大小(O)由 下式确定:

                                                \[ O = \frac{I - K + 2P}{S} + 1 \]

输出图像中的通道数等于该卷积层的卷积核个数N。

示例:

在AlexNet中,输入图像的大小为227x227x3。即宽为227,高为227,通道数为3。卷积层1有96个卷积核,每个卷积核的大小为11x11x3,步长为4,填充为0。因此,在卷积层1之后输出图像的大小(此处指宽度)是

                                                \[ O = \frac{ 227 - 11 + 2 \times 0 }{4} + 1 = 55 \] 

因此,输出图像的大小为55x55x96(每个卷积核生成一个通道)。 请读者使用上述图像作为指南来验证卷积层2、卷积层3、卷积层4和卷积层5的输出图像的大小。

Max Pool层输出张量(图像)的大小

我们来定义一下

O = 输出图像的大小(此处指宽度)。

I = 输入图像的大小(此处指宽度)。

S = 卷积运算的步长。

P_s=池大小。

输出图像的大小(O)由下式确定

                                                \[ O = \frac{ I - P_s }{S} + 1  \]

请注意,该公式可由上一节中卷积层输出图像大小的计算公式获得,只要使填充等于零,并且P_s与卷积核大小K相同即可。但与卷积层不同的是,最大池化层输出的通道数不变。

例如:在AlexNet中,卷积层1之后的最大池化层的池大小为3,步长为2。我们从上一节中知道,这个阶段的图像是55x55x96。最大池化层1之后的输出图像大小(此处指宽度)

                                                \[ O = \frac{ 55 - 3 }{2} + 1  = 27 \]

因此,输出图像的大小为27x27x96。 我们留给读者来验证最大池化层2和最大池化层3输出的大小。

完全连接层输出的大小

一个完全连接层输出一个向量,该向量长度(向量的元素个数)等于层中的神经元个数。 

 总结:AlexNet各个层的张量大小 (即每个层的神经元个数)

在AlexNet中,输入是一个大小为227x227x3的图像。在卷积层1之后,将变为为55x55x96的大小,在最大池化层1之后转换为27x27x96。在卷积层2之后,大小更改为27x27x256,并在最大池化层2之后更改为13x13x256。之后卷积层3将其转换为大小为13x13x384,而卷积层4则保持大小不变,卷积层5将更改大小为27x27x256。最后,最大池化层3将尺寸缩小到6x6x256。该图像输入全连接层1,将其转换为大小为4096×1的向量,接下来经过全连接层2,尺寸保持不变,最后,经过全连接层3之后的尺寸为1000×1。 接下来,我们要计算每个卷积层中的参数个数。

卷积层的参数个数

在CNN中,每一层都有两种参数:权重和偏差。参数的总数只是所有权重和偏差的总和。

我们来定义一下:

 W_c=Conv层的权重个数 

B_c =Conv层的偏差个数

 P_c =Conv层的参数个数

K=卷积层中使用的卷积核的大小(此处指宽度)

N=卷积核个数

C=该层输入图像的通道数

                                                 \begin{align*}  W_c &= K^2 \times C \times N \\ B_c &= N \\ P_c &= W_c + B_c \end{align*}

 在卷积层中,每个卷积核的深度总是等于输入图像中的通道数。所以每个卷积核都有K^2 × C 个参数,并且有N个这样的卷积核。这就是我们得出上述公式的方法。

例如:在AlexNet中,在卷积层1中,输入图像的通道数(C)为3,卷积核大小(K)为11,卷积核数(N)为96。所以参数的个数是:

                                               \begin{align*}  W_c &= 11^2 \times 3 \times 96 = 34,848 \\ B_c &= 96 \\ P_c &= 34,848 + 96 = 34,944 \end{align*}

读者可以验证卷积层2、卷积层3、卷积层4、卷积层5的参数个数分别为614656、885120、1327488和884992。因此,卷积层的参数总数为3747200。你认为这是一个很大的数字?好吧,等到我们看到完全连接层,你就不会这么想了。卷积层的好处之一是,权重是共享的,因此我们的参数比我们在完全连接层的情况下要少的多。所谓权重共享的意思是,卷积层的输出结果中的每个通道由一个卷积核(仅1个)经过卷积运算获得,以卷积层1为例,它的输出为55*55*96,即共有96个通道,每个通道大小为55*55,具体到其中任意一个通道,比如第一个通道C1,由55*55个点组成,它是如何得到的呢?就是由相应的1号卷积核对输入图像(227*227*3)进行一次卷积运算得到的,生成的55*55里面的每个点所使用的权重参数都是这个1号卷积核,这就叫权重共享。

 最大池化层的参数个数

没有与最大池化层相关联的参数。池的大小、步长和填充都是超参数。

全连接(FC)层的参数个数

在CNN中有两种完全连接的层。第一种是该全连接层的前面连接着最后一个卷积层,第二种是该全连接层的前面连接着其他全连接层。让我们分别考虑每一种情况。

情况1:前面连接着卷积层的全连接(FC)层的参数个数

我们来定义一下:

W_{cf}=连接到卷积层的全连接层的权重个数。

B_{cf}=连接到卷积层的全连接层的偏差个数。

O=前一个卷积层的输出图像的大小(宽度)。

N=前一个卷积层中的卷积核个数。

F=全连接层中的神经元个数。

                                                 \begin{align*} W_{cf} &= O^2 \times N \times F \\ B_{cf} &= F \\ P_{cf} &= W_{cf} + B_{cf} \end{align*}

 示例:AlexNet的第一个全连接层连接到卷积层。对于这一层,O=6,N=256,F=4096。因此,

                                                \begin{align*} W_{cf} &= 6^2 \times 256 \times 4096 = 37,748,736\\ B_{cf} &= 4096 \\ P_{cf} &= W_{cf} + B_{cf} = 37,752,832 \end{align*}

这一层的参数个数比所有卷积层的参数个数总和还要多!

情况2:前面连接着其它全连接层的全连接(FC)层的参数个数

我们来定义一下:

W_{ff}=全连接层的权数。

B_{ff}=全连接层的偏差数。

P_{ff} =全连接层的参数数目。

F=全连接层中的神经元数。

F_{-1}=前一个全连接层中的神经元数。

                                                  \begin{align*} W_{ff} &= F_{-1} \times F \\  B_{ff} &= F \\ P_{ff} &= W_{ff} + B_{ff}   \end{align*}

在上述公式中,F_{-1} × F是前一个全连接层到本全连接层的权重总数。偏差总数与本全连接层的神经元数(F)相同。

示例:AlexNet的最后一个全连接层连接到全连接层。对于这一层,F_{-1}=4096,F=1000。因此,

                                                 \begin{align*} W_{ff} &= 4096 \times 1000 = 4,096,000\\  B_{ff} &= 1,000 \\ P_{ff} &= W_{ff} + B_{ff} = 4,097,000 \end{align*}

我们留给读者来验证AlexNet中全连接层2的参数总数为16,781,312。

AlexNet中参数和张量大小(神经元个数)的数目

在AlexNet中的参数总数是5个卷积层加3个全连接层中所有参数的总和。结果竟然是62378344!下表为摘要。

注:Conv ->卷积层,MaxPool -> 最大池化层, FC -> 全连接层

Layer NameTensor SizeWeightsBiasesParameters
Input Image227x227x3000
Conv-155x55x9634,8489634,944
MaxPool-127x27x96000
Conv-227x27x256614,400256614,656
MaxPool-213x13x256000
Conv-313x13x384884,736384885,120
Conv-413x13x3841,327,1043841,327,488
Conv-513x13x256884,736256884,992
MaxPool-36x6x256000
FC-14096×137,748,7364,09637,752,832
FC-24096×116,777,2164,09616,781,312
FC-31000×14,096,0001,0004,097,000
Output1000×1000
Total   62,378,344
  • 22
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 卷积神经网络CNN)是一种深度学习技术,可以用来处理复杂的图像和语音信号,从而实现自动化识别。简单地说,CNN就是将输入图像和语音信号通过一系列卷积层和池化层处理,然后再通过全连接层和输出层得到结果。它可以用来识别图像的物体,识别语音信号的词语,甚至可以分析影像的情绪,等等。 ### 回答2: 卷积神经网络(Convolutional Neural Network,CNN)是一种用于图像识别和计算机视觉任务的重要深度学习模型。下面给出一个简单的卷积神经网络的示例: 这个示例将使用一个简单的卷积神经网络来进行手写数字识别。网络的输入是一个包含手写数字图像的数据集,目标是识别出每个图像代表的数字。 首先,我们需要对输入图像进行预处理,将其转换为适合卷积神经网络处理的格式。通常,我们将图像调整为相同大小,并将像素值标准化为[0,1]范围内的浮点数。 接下来,我们定义卷积神经网络结构一个简单的卷积神经网络通常包含以下几个部分:卷积层(Convolutional Layer),激活函数(Activation Function),池化层(Pooling Layer)和全连接层(Fully Connected Layer)。 卷积层使用一组可学习的滤波器来提取图像的特征。滤波器在图像上滑动,并对每个位置的局部图像区域进行卷积计算。卷积计算通过将滤波器的权重与图像上的像素相乘,并将结果相加得到。这样,每个卷积层的输出都是一组二维特征图。 激活函数通常用于引入非线性变换,以增强网络的表达能力。常用的激活函数有ReLU(Rectified Linear Unit)函数,它将负值设为零,并保留正值不变。 池化层用于降低特征图的空间尺寸,并减少网络参数的数量。最常用的池化操作是最大池化,它在每个区域选择最大值作为输出。 全连接层将池化层的输出连接到最终的分类层。全连接层能够捕捉输入数据之间的复杂关系,并将其映射到不同类别的概率分布。 在训练阶段,我们使用标记好的数据集对网络进行反向传播和参数更新,以优化网络的性能。在测试阶段,我们将新的图像输入网络,并使用学习到的参数进行预测。 通过不断调整网络结构参数,我们可以逐渐提升卷积神经网络的性能,使其能够在手写数字识别等任务上取得更高的准确率。 ### 回答3: 当然可以。以下是一个卷积神经网络的简单实例: 假设我们要构建一个图片分类的卷积神经网络,可以将手写数字图像进行分类,即将图像识别为0-9一个数字。 首先,我们需要准备一个数据集,包含大量带有标签的手写数字图像。这些图像将被用作训练数据和测试数据。 接下来,我们需要构建卷积神经网络的架构。一个简单的结构包括输入层、卷积层、池化层、全连接层和输出层。 输入层接收图片的像素数据,通常使用3维的张量表示(长、宽和颜色通道)。然后,卷积层通过在输入图像上滑动多个过滤器进行卷积运算,提取图像的局部特征。 卷积运算后,我们会使用池化层进行下采样操作,以减少计算量并保留主要特征。常用的池化方式是最大池化,即在小区域内保留最大值。 下一步是全连接层,把池化层的输出调整为一维向量,并将其与权重矩阵相乘,加上偏差,应用激活函数。这样可以将图像特征与类别之间建立联系。 最后,输出层根据全连接层的结果,采用softmax函数将各类别的得分映射到概率值,确定最终分类。 接下来,我们需要设计训练方法。一种常用的方法是使用反向传播算法和随机梯度下降进行模型优化。通过不断调整卷积核权重和偏差,以最小化损失函数。 在训练过程,我们可以使用一部分数据作为验证集,用于调整超参数,以免过拟合。 最后,我们可以使用测试集对训练好的模型进行评估,计算准确率、召回率和F1-score等标,判断模型的性能。 这就是一个简单的卷积神经网络的实例。通过不断优化和改进网络结构参数设置,我们可以提高模型的准确率,进一步应用于更复杂的图像分类问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值