如何计算一个卷积层的参数个数?

人工智能 卷积神经网络 过滤器 卷积层 卷积算术
2021-11-04 05:11:18

我最近在一次采访中被要求计算卷积层的参数数量。我很惭愧地承认我不知道该怎么做,尽管我多年来一直在工作和使用 CNN。

给定一个有十个卷积层3×3过滤器和形状的输入24×24×3,这个卷积层的参数总数是多少?

2个回答

卷积层的参数是什么?

卷积层的(可学习)参数是内核(或过滤器)和偏差(如果您决定拥有它们)的元素。有 1d、2d 和 3d 卷积。最常见的是 2d 卷积,也就是人们通常提到的那些,所以我将主要关注这个案例。

二维卷积

例子

如果二维卷积层有10的过滤器3×3形状和卷积层的输入是24×24×3,那么这实际上意味着过滤器将具有形状3×3×3,即每个过滤器将具有等于输入的第 3 维的第 3 维。因此,没有给出内核的第 3 维,因为它可以从输入的第 3 维确定。

2d 卷积仅沿 2 个轴(x 和 y)执行,因此得名。这是一个典型的 2d 卷积层的图片,其中内核的深度(橙色)等于输入体积的深度(青色)。

在此处输入图像描述

每个内核可以选择具有相关的标量偏差。

至此,你应该已经可以计算出一个标准卷积层的参数个数了。在你的情况下,参数的数量是10(333)+10=280.

TensorFlow 证明

以下简单的 TensorFlow(版本 2)程序可以证实这一点。

import tensorflow as tf


def get_model(input_shape, num_classes=10):
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Input(shape=input_shape))
    model.add(tf.keras.layers.Conv2D(10, kernel_size=3, use_bias=True))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(num_classes))

    model.summary()

    return model


if __name__ == '__main__':
    input_shape = (24, 24, 3)
    get_model(input_shape)

您应该尝试设置use_biasFalse了解参数数量如何变化。

一般情况

所以,一般来说,给定M形状过滤器K×K和形状的输入H×W×D,则标准 2d 卷积层的参数个数,带有标量偏差,为M(KKD)+M并且,没有偏见,是M(KKD).

另请参阅这些相关问题如何确定隐藏层过滤器的深度?在 CNN 中,每个新过滤器是否对每个输入通道具有不同的权重,或者在输入通道中使用的每个过滤器的权重是否相同?.

1d 和 3d 卷积

还有 1d 和 3d 卷积。

例如,在 3d 卷积的情况下,内核的维度可能与输入的深度不同,因此对于 3d 卷积层计算参数的数量是不同的。这是 3d 卷积层的示意图,其中内核的深度与输入体积的深度不同。

在此处输入图像描述

参见例如对卷积神经网络中 1D、2D 和 3D 卷积的直观理解

对于标准卷积层,权重矩阵的形状为(out_channels, in_channels, kernel_sizes)此外,您将需要一个形状向量来[out_channels]表示偏差。对于您的特定情况,2d,您的权重矩阵将具有(out_channels, in_channels, kernel_size[0], kernel_size[1]).

现在,如果我们插入数字:

  • out_channels = 10, 你有 10 个过滤器
  • in_channels = 3,本例图片为RGB,所以有3个通道(输入的最后一维)
  • kernel_size[0] = kernel_size[1] = 3

总的来说,你会有10*3*3*3 + 10 = 280参数。