0

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

我注意到的第一件事是,可用于预训练的“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

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

4

2 回答 2

1

你是权利。卷积参数的数量仅取决于内核的大小、特定层的通道数和总层数。

但是,当您更改输入分辨率(此处为 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。

于 2020-12-23T00:12:05.103 回答
0

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

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

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

于 2020-12-10T05:30:06.597 回答