ChatGPT解决这个技术问题 Extra ChatGPT

如何计算卷积神经网络的参数个数?

我正在使用 Lasagne 为 MNIST 数据集创建一个 CNN。我密切关注此示例:Convolutional Neural Networks and Feature Extraction with Python

我目前拥有的不包含任何 dropout 层的 CNN 架构是:

NeuralNet(
    layers=[('input', layers.InputLayer),        # Input Layer
            ('conv2d1', layers.Conv2DLayer),     # Convolutional Layer
            ('maxpool1', layers.MaxPool2DLayer), # 2D Max Pooling Layer
            ('conv2d2', layers.Conv2DLayer),     # Convolutional Layer
            ('maxpool2', layers.MaxPool2DLayer), # 2D Max Pooling Layer
            ('dense', layers.DenseLayer),        # Fully connected layer
            ('output', layers.DenseLayer),       # Output Layer
            ],
    # input layer
    input_shape=(None, 1, 28, 28),

    # layer conv2d1
    conv2d1_num_filters=32,
    conv2d1_filter_size=(5, 5),
    conv2d1_nonlinearity=lasagne.nonlinearities.rectify,

    # layer maxpool1
    maxpool1_pool_size=(2, 2),

    # layer conv2d2
    conv2d2_num_filters=32,
    conv2d2_filter_size=(3, 3),
    conv2d2_nonlinearity=lasagne.nonlinearities.rectify,

    # layer maxpool2
    maxpool2_pool_size=(2, 2),


    # Fully Connected Layer
    dense_num_units=256,
    dense_nonlinearity=lasagne.nonlinearities.rectify,

   # output Layer
    output_nonlinearity=lasagne.nonlinearities.softmax,
    output_num_units=10,

    # optimization method params
    update= momentum,
    update_learning_rate=0.01,
    update_momentum=0.9,
    max_epochs=10,
    verbose=1,
    )

这将输出以下层信息:

  #  name      size
---  --------  --------
  0  input     1x28x28
  1  conv2d1   32x24x24
  2  maxpool1  32x12x12
  3  conv2d2   32x10x10
  4  maxpool2  32x5x5
  5  dense     256
  6  output    10

并输出可学习参数的数量为 217,706

我想知道这个数字是如何计算的?我已经阅读了许多资源,包括这个 StackOverflow 的 question,但没有一个能清楚地概括计算。

如果可能,是否可以推广每层可学习参数的计算?

例如卷积层:过滤器数量 x 过滤器宽度 x 过滤器高度。


L
Løiten

让我们首先看看如何为您拥有的每种单独类型的层计算可学习参数的数量,然后计算示例中的参数数量。

输入层:输入层所做的只是读取输入图像,所以这里没有可以学习的参数。

卷积层:考虑一个卷积层,其输入为 l 个特征图,输出为 k 个特征图。过滤器尺寸为 nx m。例如,这将如下所示:这里,输入有 l=32 个特征图作为输入,k=64 个特征图作为输出,过滤器大小为 n=3 xm=3。重要的是要理解,我们不是简单地有一个 3x3 过滤器,而是实际上是一个 3x3x32 过滤器,因为我们的输入有 32 个维度。我们学习了 64 种不同的 3x3x32 过滤器。因此,权重的总数为 n*m*k*l。然后,每个特征图还有一个偏置项,所以我们的参数总数为(n*m*l+1)*k。

池化层:池化层例如执行以下操作:“将 2x2 邻域替换为其最大值”。因此,您无法在池化层中学习任何参数。

全连接层:在全连接层中,所有输入单元对每个输出单元都有单独的权重。对于 n 个输入和 m 个输出,权重的数量为 n*m。此外,您对每个输出节点都有一个偏差,因此您处于 (n+1)*m 个参数。

输出层:输出层是一个普通的全连接层,所以(n+1)*m个参数,其中n是输入的个数,m是输出的个数。

最后一个困难是第一个全连接层:我们不知道该层输入的维数,因为它是一个卷积层。要计算它,我们必须从输入图像的大小开始,计算每个卷积层的大小。在您的情况下,千层面已经为您计算并报告尺寸 - 这对我们来说很容易。如果一定要自己计算每一层的大小,那就有点复杂了:

在最简单的情况下(如您的示例),卷积层的输出大小为 input_size - (filter_size - 1),在您的情况下:28 - 4 = 24。这是由于卷积的性质:我们使用例如,一个 5x5 邻域来计算一个点 - 但最外面的两个行和列没有 5x5 邻域,因此我们无法计算这些点的任何输出。这就是为什么我们的输出比输入小 2*2=4 行/列的原因。

如果不希望输出小于输入,可以对图像进行零填充(使用 Lasagne 中卷积层的 pad 参数)。例如,如果您在图像周围添加 2 行/列的零,则输出大小将为 (28+4)-4=28。所以在填充的情况下,输出大小是 input_size + 2*padding - (filter_size -1)。

如果您明确希望在卷积期间对图像进行下采样,您可以定义一个步幅,例如 stride=2,这意味着您以 2 个像素的步长移动过滤器。然后,表达式变为 ((input_size + 2*padding - filter_size)/stride) +1。

在您的情况下,完整的计算是:

  #  name                           size                 parameters
---  --------  -------------------------    ------------------------
  0  input                       1x28x28                           0
  1  conv2d1   (28-(5-1))=24 -> 32x24x24    (5*5*1+1)*32   =     832
  2  maxpool1                   32x12x12                           0
  3  conv2d2   (12-(3-1))=10 -> 32x10x10    (3*3*32+1)*32  =   9'248
  4  maxpool2                     32x5x5                           0
  5  dense                           256    (32*5*5+1)*256 = 205'056
  6  output                           10    (256+1)*10     =   2'570

所以在你的网络中,你总共有 832 + 9'248 + 205'056 + 2'570 = 217'706 个可学习参数,这正是 Lasagne 报告的。


很好的答案,谢谢。唯一让我感到困惑的是卷积层大小是如何计算的。我不确定 24x24 和 10x10 来自哪里。
我添加了有关卷积层中大小计算的更多详细信息 - 如果这有帮助,请告诉我。
嗨@hbaderts,我还有一个问题。根据你们这里的这张表,模型尺寸是指这里所有个体尺寸的总和,对吗?对于 CNN,理解模型大小与可学习参数的数量成反比是否明智?请您看一下 stackoverflow.com/questions/43443342/… 吗?
@hbaderts,你的解释很有帮助,但我很困惑为什么你在 ((nml+1)*k) 中处理偏差 a 1,如果我有 16 个输出特征,那么偏差也将是 16,不是吗?所以我们必须在上面的公式中加上 16?
@honar.cs 如果您有 16 个输出特征,那么 k=16。等式是 (n*m*l+1)*k+1 在括号内。所以 +1 也乘以 16,为您的示例给出 n*m*l*16 + 16。这有帮助吗?
S
Sandipan Dey

基于@hbaderts 的出色回复,刚刚提出了一些ICPCPHO 网络的公式(因为我正在研究类似的问题),在下图中分享它可能会有所帮助。

https://i.stack.imgur.com/kudnL.png

此外,(1) 步长为 2x2 的卷积层和 (2) 步长为 2x2 的卷积层 + 步长为 2x2 的 (max/avg) 池化,每个都贡献了相同数量的参数和“相同”的填充,如下所示:

https://i.stack.imgur.com/q3OGi.png


a
ashraful16

卷积层大小为 calculated=((n+2p-k)/s)+1

这里,

n 是输入 p 是填充 k 是内核或过滤器 s 是步幅

在上述情况下

n=28 p=0 k=5 s=1


嗨@gaurav 有问题它询问的是可学习参数而不是输出大小您已经回答了输出大小明确提及它,否则您将开始被否决

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅