【问题标题】:Access to intermediate layers in Keras Functional Model访问 Keras 功能模型中的中间层
【发布时间】:2021-05-27 02:00:03
【问题描述】:

我使用的迁移学习模型与Chollet's keras Transfer learning guide 中解释的非常相似。为了避免批量归一化层出现问题,如指南和许多其他地方所述,我必须将原始预训练的基本模型作为功能模型插入,使用 training=false 选项,如下所示:

  inputs = layers.Input(shape=(224,224, 3))
  x = img_augmentation(inputs)
  baseModel = VGG19(weights="imagenet", include_top=False,input_tensor=x)
  x=baseModel(x,training=False)

  # construct the head of the model that will be placed on top of the
  # the base model
  x=Conv2D(32,2)(x)
  headModel = AveragePooling2D(pool_size=(4, 4))(x)
  headModel = Flatten(name="flatten")(headModel)
  headModel = Dense(64, activation="relu")(headModel)
  headModel = Dropout(0.5)(headModel)
  headModel = Dense(3, activation="softmax")(headModel)
  model = Model(inputs, outputs=headModel) 

我的问题是我需要像Chollet's gradcam example page 那样使用gradcam。为此,我需要访问 basemodel 最后一个卷积层,但是当我总结我的模型时,我得到:

Model: "model_163"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
img_augmentation (Sequential (None, 224, 224, 3)       0         
_________________________________________________________________
vgg19 (Functional)           (None, 7, 7, 512)         20024384  
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 6, 6, 32)          65568     
_________________________________________________________________
average_pooling2d_2 (Average (None, 1, 1, 32)          0         
_________________________________________________________________
flatten (Flatten)            (None, 32)                0         
_________________________________________________________________
dense_4 (Dense)              (None, 64)                2112      
_________________________________________________________________
dropout_2 (Dropout)          (None, 64)                0         
_________________________________________________________________
dense_5 (Dense)              (None, 3)                 195       
=================================================================
Total params: 20,092,259
Trainable params: 67,875
Non-trainable params: 20,024,384
__________________________________________

因此,我需要的输出位于 vgg19 功能模型层之一。如何在不删除 training=True 选项的情况下访问该层?

【问题讨论】:

    标签: tensorflow2.0 heatmap keras-layer transfer-learning batch-normalization


    【解决方案1】:

    我通常不喜欢在模型中嵌套模型。尽管它鼓励模块化并为复杂模型引入了良好的结构,但当您想做非常规的事情(如计算 GradCAM 或访问梯度等)时,TensorFlow 会给您带来麻烦。我发现取消嵌套模型更容易,这样您就可以轻松访问您喜欢的层。

    我最近写了一个教程来实现GradCAM on TensorFlow 2 for InceptionNet。它应该为您提供足够的上下文来访问所需的层。

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2020-11-07
      相关资源
      最近更新 更多