Я использую предварительно обученные модели для классификации изображений. Мой вопрос в том, какие слои мне нужно добавить после использования предварительно обученной структуры модели в моей модели, соответственно. почему эти две реализации отличаются. Для уточнения c:
Рассмотрим два примера, один из которых использует набор данных cats and dogs:
Можно найти одну реализацию здесь . Ключевым моментом является то, что базовая модель:
# 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)
])
Таким образом, они добавили не только последний плотный (1) слой, но и слой GlobalAveragePooling2D (). раньше.
Другой, использующий набор данных tf flowers:
В этой реализации все по-другому. 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. Когда я проверяю модель в первой реализации:
I can see that the last layer is a relu activation layer.
When I check the feature_extractor:
model = tf.keras.Sequential([
feature_extractor,
tf.keras.layers.Dense(1)
])
model.summary()
I get the output:
ex2
Так что, возможно, причина также в том, что я не понимаю разницы между tf.keras.applications.MobileNetV2
и hub.KerasLayer
. Hub.KerasLayer просто дает мне средство для извлечения функций. Я знаю это, но все же думаю, что не заметил разницы между этими двумя методами.
Я не могу проверить слои самого feature_extractor. Таким образом, feature_extractor.summary () или feature_extractor.layers не работает. Как я могу здесь проверить слои? И как я могу узнать, нужно ли добавлять GlobalAveragePooling2D?