在自定义数据集上微调 MobileNet 时出现形状错误

Posted

技术标签:

【中文标题】在自定义数据集上微调 MobileNet 时出现形状错误【英文标题】:Shape Error while Fine Tuning MobileNet On A Custom Data Set 【发布时间】:2022-01-16 11:10:50 【问题描述】:

我跟随 deeplizard 对 MobileNet 进行微调。我试图做的是从模型的第 5 层到最后一层抓取输出并将其存储在这个变量 x 中。模型第 5 层到最后一层的输出形状为global_average_pooling2d_3 (None, 1, 1, 1024)。然后添加一个具有 10 个单元的输出密集层。但是,在拟合模型时,出现以下错误。任何人都可以请给我一些指导。非常感谢。我的代码如下所示

mobile = tf.keras.applications.mobilenet.MobileNet()
mobile.summary()
x = mobile.layers[-5].output
output =layers.Dense(units=10, activation='softmax')(x)
model = Model(inputs=mobile.input, outputs=output)

for layer in model.layers[:-23]:
    layer.trainable = False

model.compile(optimizer=Adam(lr=0.0001), 
              loss='categorical_crossentropy', 
              metrics=['accuracy'])

model.fit(x=train_batches,
            steps_per_epoch=len(train_batches),
            validation_data=valid_batches,
            validation_steps=len(valid_batches),
            epochs=30,
            verbose=2
)

ValueError: Shapes (None, None) and (None, 1, 1, 10) are incompatible

【问题讨论】:

【参考方案1】:

当您如下调用基本模型时,它将使用默认参数启动。其中include_top设置为True

mobile = tf.keras.applications.mobilenet.MobileNet()

而且,这带来了 (source) GlobalAvgkeepdims=True

  if include_top:
    x = layers.GlobalAveragePooling2D(keepdims=True)(x)

现在,根据您的错误,我假设了您的真实标签形状,在这里您可以简单地执行以下操作

mobile = keras.applications.mobilenet.MobileNet()
x = mobile.layers[-5].output # shape=(None, 1, 1, 1024)
x = layers.Flatten()(x) # < --- Here shape=(None, 1024)

output =layers.Dense(units=10, activation='softmax')(x)
model = Model(inputs=mobile.input, outputs=output)

【讨论】:

非常感谢@M.Innat,我对 dnn 很陌生。我怀疑我应该重塑 GlobalAveragePooling2D 的输出。但不知道如何。您的答案完美无缺。非常感谢您的指导。

以上是关于在自定义数据集上微调 MobileNet 时出现形状错误的主要内容,如果未能解决你的问题,请参考以下文章

在自定义数据集上训练 tensorflow attention-ocr 的管道是啥?

获取 InvalidArgumentError:NewRandomAccessFile 在自定义图像数据集上使用 tf.data 时无法创建/打开

在自定义数据集上训练 Faster-RCNN 模型时加载检查点

如何在自定义数据集上执行RCNN对象检测?

YOLOv8已至,精度大涨!教你如何在自定义数据集上训练它

[YOLO专题-14]:YOLO V5 - ultralytics在自定义数据集上获得高性能的常见关键项