Keras 如何在还有 None 个维度的情况下计算早期的参数个数?

How Keras can calculate the number of parameters at early stage when there are still None dimensions?

很抱歉这个非常基本的问题(我是 Keras 的新手)。我想知道 Keras 如何在早期阶段(拟合之前)为每一层计算参数的数量,尽管 model.summary 表明在这个阶段仍有一些维度具有 None 值。这些值是否已经以某种方式确定?如果是,为什么不在摘要中显示它们?

我问这个问题是因为我很难弄清楚我的“张量形状错误”(我试图确定我的 resnet50 模型的 C5 块的输出维度,但我看不到它们model.summary即使我看到了参数个数)。

我在下面给出了一个基于 RetinaNet 中的 C5_reduced 层的示例,该层由 Resnet50 的 C5 层提供。 C5_reduced 是

Conv2D(256,kernel_size=1,strides=1,pad=1)

基于此特定图层的 model.summary:

C5_reduced (Conv2D)    (None, None, None, 256)          524544 

我猜测 C5 是 (None,1,1,2048) 因为 2048*256+256 = 524544(我不知道如何证实或证实这个假设)。所以如果它已经知道,为什么不在摘要中显示它呢?如果维度 2 和维度 3 不同,参数的数量也会不同吧?

您需要为您的模型定义一个输入层。在您 a) 编译模型并为其提供数据之前,可训练参数的总数是未知的,此时模型根据输入的维度制作图表,然后您将能够确定参数的数量,或者b) 您为模型定义了一个输入层,其中包含输入维度,然后您可以使用 model.summary().

找到参数的数量

关键是模型在定义之前无法知道输入层和第一个隐藏层之间的参数数量,或者您运行推断并给它输入的形状。

如果您将准确的输入形状传递到网络上的第一层或输入层,您将获得所需的输出。例如我在这里使用了输入层:

input_1 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     

传递的输入为 (224,224,3)。 3代表这里的深度。请注意,卷积参数的计算与 Dense 层的计算不同。

如果您执行以下操作:

tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3))

你会看到:

conv2d (Conv2D) ---> (None, 148, 148, 16)    

尺寸缩小为 148x148,在 Keras 中内边距默认为 valid。另外strides是1,那么输出的shape就是148 x 148。(公式可以自己搜索)

那么 None 值是多少?

  • 第一个None值是批量大小。在 Keras 中,第一个维度是批量大小。您可以将它们传递并固定,也可以在拟合模型或预测时确定它们。
  • 在2D卷积中,期望的输入是(batch_size, height, width, channels),你也可以有( None、None、None、3),这意味着允许使用不同的图像尺寸。

编辑:

tf.keras.layers.Input(shape = (None, None, 3)),
tf.keras.layers.Conv2D(16, (3,3), activation='relu')

生产:

conv2d_21 (Conv2D)           (None, None, None, 16)    448       

关于你的问题,即使我们将图像高度和宽度传递为 None,参数是如何计算的?

卷积参数计算依据:

(filter_height * filter_width * input_image_channels + 1) * number_of_filters

当我们将它们放入公式中时,

filter_height = 3
filter_width = 3
input_image_channel = 3
number_of_filters = 16

参数 = (3 x 3 x 3 + 1) * 16 = 28 * 16 = 448

注意,我们只需要input_image的通道数为3,代表它是RGB图像。

如果要为后面的卷积计算参数,需要考虑上一层的过滤器数量成为当前层通道的通道数量。

这就是您最终拥有 None 参数而不是 batch_size 的方式。在这种情况下,Keras 需要知道您的图像是否为 RGB。或者您不会在创建模型时指定维度,而是可以在用数据集拟合模型时传递它们。