使用预训练的模型后要使用的层:何时添加GlobalAveragePooling2D()

时间:2020-07-13 16:20:49

标签: python tensorflow keras transfer-learning tensorflow-hub

我正在使用预先训练的模型对图像进行分类。我的问题是在模型中使用预训练的模型结构后,我必须添加什么样的图层。这两个实现为何不同。具体来说:

考虑两个示例,一个使用猫和狗数据集:

可以找到一个实现here。关键点是基本模型:

# Create the base model from the pre-trained model MobileNet V2
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                               include_top=False,
                                               weights='imagenet')
base_model.trainable = False
在添加最终tf.keras.layers.Dense(1)之前,

被冻结并添加了GlobalAveragePooling2D()。因此,模型结构如下:

model = tf.keras.Sequential([
  base_model,
  global_average_layer,
  prediction_layer
])

等效于:

model = tf.keras.Sequential([
  base_model,
  tf.keras.layers.GlobalAveragePooling2D()
  tf.keras.layers.Dense(1)
])

因此,他们不仅添加了最终的density(1)层,而且还添加了GlobalAveragePooling2D()层。

另一个使用tf flowers数据集:

在此implementation中是不同的。没有添加GlobalAveragePooling2D()。

feature_extractor_url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/2" 

feature_extractor_layer = hub.KerasLayer(feature_extractor_url,
                                         input_shape=(224,224,3))
feature_extractor_layer.trainable = False

model = tf.keras.Sequential([
  feature_extractor_layer,
  layers.Dense(image_data.num_classes)
])

其中image_data.num_classes为5表示不同的花朵分类。因此,在此示例中,未添加GlobalAveragePooling2D()层。

我不明白这一点。为什么有什么不同?什么时候添加GlobalAveragePooling2D()?还有什么更好的/我应该怎么做?

我不确定原因是否是在一种情况下,猫和狗的数据集是二进制分类,在另一种情况下是多类分类问题。或不同之处在于,在一种情况下,tf.keras.applications.MobileNetV2用于加载MobileNetV2,而在另一种实现方式中,hub.KerasLayer用于获取feature_extractor。当我在第一个实现中检查模型时:

ex1

我可以看到最后一层是relu激活层。

当我检查feature_extractor时:

model = tf.keras.Sequential([
  feature_extractor,
  tf.keras.layers.Dense(1)
])

model.summary()

我得到输出:

ex2

所以也许原因也是我不了解tf.keras.applications.MobileNetV2hub.KerasLayer之间的区别。 hub.KerasLayer只是给了我特征提取器。我知道这一点,但我仍然认为这两种方法之间没有区别。

我无法检查feature_extractor本身的图层。因此feature_extractor.summary()或feature_extractor.layers无效。我如何在这里检查图层?我怎么知道应该不添加GlobalAveragePooling2D?

1 个答案:

答案 0 :(得分:-1)

让我们说有一个模型拍摄[1,208,208,3]图像,并有6个具有内核[2,2,2,2,2,2,7]的池化层,这将导致图像[ 1,1,1,2048],用于最后一个转换层中的2048个过滤器。请注意,最后一个池化层如何接受[1,7,7,2048]输入

如果我们放松输入图像的约束(这通常是对象检测模型的情况),则比在同一组合并层之后,大小为[1,104,208,3]的图像将产生前-后-池输出[1、4、7、2024]和[1、256、408、3]中的“ 0”将产生[1、8、13、2048]。该地图将具有与原始[1,7,7,2048]相同的数量信息,但是原始池化层将不会生成具有[1,1,1,N]的要素列。这就是为什么我们切换到全局池层的原因。

简而言之,如果我们对输入图像的大小没有严格限制(并且不要将图像的大小作为模型中的第一个操作项),则全局池化层非常重要。