我最近在一次采访中被要求计算卷积层的参数数量。我很惭愧地承认我不知道该怎么做,尽管我多年来一直在工作和使用 CNN。
给定一个有十个卷积层过滤器和形状的输入,这个卷积层的参数总数是多少?
我最近在一次采访中被要求计算卷积层的参数数量。我很惭愧地承认我不知道该怎么做,尽管我多年来一直在工作和使用 CNN。
给定一个有十个卷积层过滤器和形状的输入,这个卷积层的参数总数是多少?
卷积层的(可学习)参数是内核(或过滤器)和偏差(如果您决定拥有它们)的元素。有 1d、2d 和 3d 卷积。最常见的是 2d 卷积,也就是人们通常提到的那些,所以我将主要关注这个案例。
如果二维卷积层有的过滤器形状和卷积层的输入是,那么这实际上意味着过滤器将具有形状,即每个过滤器将具有等于输入的第 3 维的第 3 维。因此,没有给出内核的第 3 维,因为它可以从输入的第 3 维确定。
2d 卷积仅沿 2 个轴(x 和 y)执行,因此得名。这是一个典型的 2d 卷积层的图片,其中内核的深度(橙色)等于输入体积的深度(青色)。
每个内核可以选择具有相关的标量偏差。
至此,你应该已经可以计算出一个标准卷积层的参数个数了。在你的情况下,参数的数量是.
以下简单的 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_bias
以False
了解参数数量如何变化。
所以,一般来说,给定形状过滤器和形状的输入,则标准 2d 卷积层的参数个数,带有标量偏差,为并且,没有偏见,是.
另请参阅这些相关问题如何确定隐藏层过滤器的深度?在 CNN 中,每个新过滤器是否对每个输入通道具有不同的权重,或者在输入通道中使用的每个过滤器的权重是否相同?.
还有 1d 和 3d 卷积。
例如,在 3d 卷积的情况下,内核的维度可能与输入的深度不同,因此对于 3d 卷积层计算参数的数量是不同的。这是 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
参数。