我正在关注关于使用 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
即使卷积过滤器的数字大小会根据自定义输入形状发生相应变化。那么即使卷积滤波器具有更大的(空间)尺寸,参数的数量如何保持不变呢?
你是权利。conv 参数的数量仅取决于内核的大小、特定层的通道数和总层数。
但是,当您更改输入分辨率(此处为 640x480x3)时,问题在于 fc 层之前的最后一层与具有 224x224x3 的网络具有不同的维度。因此,它不兼容。
为什么?
输入分辨率为 224x224x3 的示例:
步幅影响中间特征图的分辨率。如果您使用 640x480x3 输入分辨率,那么最后一层会更大,因此 FC 层不兼容。您应该将从 vanilla 模型(分辨率为 224x224)学到的卷积权重传输到与 640x480x3 输入数据兼容的新卷积网络。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句