【发布时间】:2020-11-02 21:31:44
【问题描述】:
我正在使用预训练模型对图像进行分类。我的问题是在我的模型中使用预训练模型结构后,我必须添加什么样的层,resp。为什么这两个实现不同。具体来说:
考虑两个示例,一个使用猫和狗数据集:
可以在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
被冻结并添加了 GlobalAveragePooling2D(),然后添加了最终的 tf.keras.layers.Dense(1)。所以模型结构如下:
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)
])
所以他们之前不仅添加了最终的dense(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 用于获取特征提取器。当我在第一个实现中检查模型时:
可以看到最后一层是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?
【问题讨论】:
标签: python tensorflow keras transfer-learning tensorflow-hub