获取最后的卷积层迁移学习

Acces to last convolutional layer transfer learning

我正在尝试从计算机视觉模型中获取一些热图,该模型已经在对图像进行分类,但我发现了一些困难。 这是模型摘要:

model.summary()
Model: "model_4"

Layer (type)                 Output Shape              Param #   
=================================================================
input_9 (InputLayer)         [(None, 512, 512, 1)]     0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 512, 512, 3)       30        
_________________________________________________________________
densenet121 (Functional)     (None, 1024)              7037504   
_________________________________________________________________
dense_4 (Dense)              (None, 100)               102500    
_________________________________________________________________
dropout_4 (Dropout)          (None, 100)               0         
_________________________________________________________________
predictions (Dense)          (None, 2)                 202       
=================================================================
Total params: 7,140,236
Trainable params: 7,056,588
Non-trainable params: 83,648

作为创建热图的标准过程的一部分,我知道我必须访问模型中的最后一个卷积层,在这种情况下我会说它是 Densenet121 内部的一个层,但我不能找到一种方法来访问属于 densenet121 的所有层。

现在,我一直在使用 conv2d_4 层来 运行 一些测试,但我觉得这不是正确的方法,因为该层是在 densenet 的所有迁移学习工作之前。

另外,我刚刚在KErar官方文档中查找了Funcitnal层,但我没有找到它,所以我猜它不是一个层,它就像嵌入在那里的孔densenet模型,但我找不到方法访问。

顺便分享一下模型构建,因为它可能有助于回答这个问题:

from tensorflow.keras.applications.densenet import DenseNet121

num_classes = 2
input_tensor = Input(shape=(IMG_SIZE,IMG_SIZE,1))
x = Conv2D(3,(3,3), padding='same')(input_tensor)   
x = DenseNet121(include_top=False, classes=2, pooling="avg", weights="imagenet")(x)

x = Dense(100)(x)
x = Dropout(0.45)(x)
predictions = Dense(num_classes, activation='softmax', name="predictions")(x)
model = Model(inputs=input_tensor, outputs=predictions)   

我发现你可以使用 .get_layer() 两次访问“主”模型中嵌入的功能性 densenet 模型内的层。

在这种情况下,我可以使用 model.get_layer('densenet121').summary() 检查嵌入模型中的所有层,然后将它们与此代码一起使用:model.get_layer('densenet121').get_layer('xxxxx')