如何计算卷积神经网络的参数数量?
conv-neural-network
deep-learning
neural-network
6
0

我正在使用Lasagne为MNIST数据集创建CNN。我密切关注这个示例: 卷积神经网络和Python的特征提取

我目前拥有的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的问题 ,但是没有一个资源可以清楚地概括该计算。

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

例如,卷积层:滤镜数量x滤镜宽度x滤镜高度。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

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

在此处输入图片说明

同样,(1)跨度为2x2的卷积层和(2)跨度为1x1跨度的卷积层+跨度为2x2的(max / avg)合并,每个层都使用“相同”填充填充相同数量的参数,如下所示:

在此处输入图片说明

收藏
评论

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

  • 输入层 :所有输入层所做的都是读取输入图像,因此这里没有可以学习的参数。
  • 卷积层 :考虑一个卷积层,该卷积层在输入处具有l特征图,并具有k特征图作为输出。过滤器尺寸为n x m 。例如,如下所示:

    卷积层的可视化

    在此,输入具有l=32特征图作为输入, k=64特征图作为输出,并且过滤器大小为n=3 x m=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) ,在您的情况下为: input_size - (filter_size - 1) =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报告的内容。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号