在自定义数据集上微调 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) GlobalAvg
和 keepdims=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 时无法创建/打开