Слои, которые будут использоваться после использования предварительно обученной модели: когда добавлять GlobalAveragePooling2D () - PullRequest
0 голосов
/ 13 июля 2020

Я использую предварительно обученные модели для классификации изображений. Мой вопрос в том, какие слои мне нужно добавить после использования предварительно обученной структуры модели в моей модели, соответственно. почему эти две реализации отличаются. Для уточнения 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. Когда я проверяю модель в первой реализации:

ex1

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?

1 Ответ

0 голосов
/ 15 июля 2020

Допустим, есть модель, принимающая [1, 208, 208, 3] изображений и имеющая 6 уровней объединения с ядрами [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] будут давать [1, 8, 13, 2048]. Эти карты будут иметь примерно такой же объем информации, что и исходные [1, 7, 7, 2048], но исходный слой объединения не будет создавать столбец функций с [1, 1, 1, N]. Вот почему мы переключаемся на уровень глобального пула.

Короче говоря, уровень глобального пула важен, если у нас нет строгих ограничений на размер входного изображения (и не изменяйте размер изображения при первой операции в модель).

...