如何计算卷积神经网络的参数数量?
0 317
1

我正在使用Lasagne为MNIST数据集创建CNN。 我目前拥有的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 我想知道这个数字是如何计算的? 如果可能,是否可以概括每层学习参数应如何计算?

收藏
2021-02-08 15:07 更新 anna •  3934
共 1 个回答
高赞 时间
0

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

  • 输入层:所有输入层所做的都是读取输入,因此这里没有可以学习的参数。

  • 卷积层:假设一个卷积层,它在输入处接受l个特征映射,并以k个特征映射作为输出。 过滤器的大小是nxm。例如,这看起来像这样: 这里,输入有l=32个特征映射作为输入,k=64个特征映射作为输出,滤波器大小为n=3xm=3。 重要的是要理解,我们不仅仅有3x3滤波器,而是实际上有3x3x32滤波器,因为我们的输入有32个维度,并且我们学习了64种不同的3x3x32滤波器。 因此,权重的总数是nmkl。然后,每个特征映射也有一个偏置项,因此我们有(nm*l1)*k个参数。

  • 池层:例如执行以下操作:“用其最大值替换2x2邻域”。因此,在池化层中没有可以学习的参数。

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

  • 输出层:输出层是正常的全连接层,所以有(n+1)*m个参数,其中n为输入数,m为输出数。

最后的困难是完全连接的层:我们不知道输入到该层的维数,因为它是一个卷积层。 要计算它,我们必须从输入图像的大小开始,并计算每个卷积层的大小。 在你的情况下,Lasagne已经为你计算并报告大小-这使我们很容易。 如果你必须自己计算每一层的大小,这有点复杂:

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

  • 如果不希望输出小于输入,一个人可以零填充图像( 在Lasagne中卷积层的pad参数)。E.g.如果在图像周围添加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报告的内容。

via:https://stackoverflow.com/a/42787467/14964791

收藏
2021-02-08 16:03 更新 karry •  3510