我使用tensorflow 2.6 keras进行迁移学习。目前我使用MobileNetV2。我接受输入,使用Lambda层进行一些预处理,然后将预处理后的输入输入到MobileNetV2,然后添加Dense层并训练它。训练、推理等实际起到了预期的作用。
然而,该模型的摘要如下:
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) [(None, 201, 189, 1)] 0
_________________________________________________________________
lambda (Lambda) (None, 201, 189, None) 0
_________________________________________________________________
lambda_1 (Lambda) (None, 201, 189, None) 0
_________________________________________________________________
mobilenetv2_1.00_224 (Functi (None, 7, 6, 1280) 2257984
_________________________________________________________________
flatten (Flatten) (None, 53760) 0
_________________________________________________________________
output (Dense) (None, 2) 107522
=================================================================
Total params: 2,365,506
Trainable params: 2,331,394
Non-trainable params: 34,112
因此,MobileNetV2结构被隐藏并显示为类型为tensorflow.python.keras.engine.functional.Functional
的一层。如果我打印这个层的摘要,我会得到模型的所有内部层。我有一个用于自动GradCam可视化的脚本,它会查找模型的最后一个Conv层。如果模型是使用Lambda、Conv2D、Dense层手动构建的,那么每个层都可以正常工作。如果我使用预训练的模型,那么目前它失败了,因为Conv层隐藏在这个函数层内部。
如何使用附加层构建修改后的MobileNetV2模型,以便显示模型的完整结构?
这就是我大致构建最终模型的方式:
input = Input(shape=params.image_shape, name="input")
flow = input
flow = input_correction(flow, params) #some Lambda layers
keras_model = MobileNetV2(
input_shape=image_shape,
weights='imagenet',
include_top=False)
keras_model_output=keras_model(flow)
keras_model_input=input
keras_model_output = Flatten()(keras_model_output)
output = Dense(units=len(params.classes),
activation=tf.nn.softmax,
name="output")(keras_model_output)
model = Model(inputs=keras_model_input, outputs=output)
model.compile(...)
默认情况下,summary不显示嵌套模型。只需在摘要中包含expand_nested
参数即可。
model.summary(expand_nested=True)