MobileNetV2 如何为不同的自定义输入形状提供相同数量的参数?

How can MobileNetV2 have the same number of parameters for different custom input shapes?

我正在关注 tensorflow2 tutorial 使用 MobileNetV2 作为基础架构进行微调和迁移学习。

我注意到的第一件事是预训练 'imagenet' 权重可用的最大输入形状是 (224, 224, 3)。我尝试使用自定义形状 (640, 640, 3),根据文档,它发出警告,指出 (224, 224, 3) 形状的权重已加载。

所以如果我像这样加载网络:

import tensorflow as tf

tf.keras.backend.clear_session()
def create_model():
  base_model = tf.keras.applications.MobileNetV2(input_shape=(640,640,3),
                                include_top=False)
  x = base_model.output
  x = tf.keras.layers.GlobalAveragePooling2D()(x)
  x = tf.keras.layers.Dense((1), activation='sigmoid')(x)
  x = tf.keras.Model(inputs=base_model.inputs, outputs=x)
  x.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.0001),
                         loss='binary_crossentropy',
                         metrics=[tf.keras.metrics.BinaryAccuracy()])
  return x

tf_model = create_model()

它发出警告:

WARNING:tensorflow:`input_shape` is undefined or non-square, or `rows` is not in [96, 128, 160, 192, 224]. Weights for input shape (224, 224) will be loaded as the default.

如果我尝试使用像 (224, 224, 3) 这样的输入形状,那么警告就会消失,不过,我尝试使用

检查两种情况下可训练参数的数量
tf_model.summary()

发现可训练参数个数是一样的

Total params: 2,259,265
Trainable params: 2,225,153
Non-trainable params: 34,112

尽管卷积滤波器的数字大小会根据自定义输入形状发生相应变化。那么,即使卷积滤波器具有更大的(空间)尺寸,参数的数量如何保持不变?

经过更详细的检查,参数的数量似乎取决于内核大小和每个卷积层的滤波器数量,以及最终全连接层上的神经元数量,还有一些是由于 Batch之间的归一化层。

由于none这些方面取决于输入图像的大小,即空间分辨率可能在每个卷积层的输出中发生变化,但卷积核的大小仍然是相同(例如3x3x3),因此参数的数量也将是固定的。

这种网络(即卷积神经网络)的参数数量与输入的空间大小无关。尽管如此,通道数(例如 RGB 彩色图像中的 3 个)必须恰好为 3.

你是对的。 conv 参数的数量仅取决于内核的大小、特定层的通道数和总层数。

但是,当您更改输入分辨率(此处为 640x480x3)时出现的问题是 fc 层之前的最后一层与 224x224x3 网络的维度不同。因此,它不兼容。

为什么?

输入分辨率为 224x224x3 的示例:

  1. 第 1 层步幅 = 2 因此第 1 层的输出为 112x112x32
  2. 第 2 层步幅 = 2 因此第 2 层的输出为 56x56x16
  3. 第 3 层步幅 = 1 因此第 3 层的输出为 56x56x32
  4. 等等...

步幅影响中间特征图的分辨率。 如果您使用 640x480x3 输入分辨率,那么最后一层会更大,因此 FC 层不兼容。 您应该将从 vanilla 模型(具有 224x224 分辨率)学习的卷积权重传输到与 640x480x3 输入数据兼容的新 convnet。