我正在使用预先训练的模型对图像进行分类。我的问题是在模型中使用预训练的模型结构后,我必须添加什么样的图层。这两个实现为何不同。具体来说:
考虑两个示例,一个使用猫和狗数据集:
可以找到一个实现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。当我在第一个实现中检查模型时:
我可以看到最后一层是relu激活层。
当我检查feature_extractor时:
model = tf.keras.Sequential([
feature_extractor,
tf.keras.layers.Dense(1)
])
model.summary()
我得到输出:
所以也许原因也是我不了解tf.keras.applications.MobileNetV2
与hub.KerasLayer
之间的区别。 hub.KerasLayer只是给了我特征提取器。我知道这一点,但我仍然认为这两种方法之间没有区别。
我无法检查feature_extractor本身的图层。因此feature_extractor.summary()或feature_extractor.layers无效。我如何在这里检查图层?我怎么知道应该不添加GlobalAveragePooling2D?
答案 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]的要素列。这就是为什么我们切换到全局池层的原因。
简而言之,如果我们对输入图像的大小没有严格限制(并且不要将图像的大小作为模型中的第一个操作项),则全局池化层非常重要。