Этого должно быть достаточно, учитывая следующие ограничения:
- Ваша сеть не является полностью сверточной, вы не сможете изменить размер ввода.
- В вашей сети может быть закодирована некоторая пространственная информация (поскольку вы конвертируете сетку в плоский вектор).
Это не означает, что эта концепция неверна или нет. Например, бывают случаи, когда важно закодировать позицию. И есть другие, где интересно работать с изображениями разных размеров, например, делать выводы в нескольких масштабах и усреднять результаты.
Для этого в Keras вам нужна только оригинальная модель VGG. Вы можете создать новый:
model_base = tf.keras.applications.VGG16(
include_top=True,
weights="imagenet",
input_tensor=None,
input_shape=None,
pooling=None,
classes=1000,
classifier_activation="softmax",
)
new_input = model_base.input
new_output = model_base.get_layer('fc2').output
model = tf.keras.Model(new_input, new_output)
Это очень распространенный способ извлечения признаков, в зависимости от ваших интересов вы можете оставить FC или нет. Например, если вы проанализируете исходный код keras: https://github.com/keras-team/keras-applications/blob/master/keras_applications/vgg16.py вы увидите, что если вы укажете include_top=False, часть FC будет удалена (известная как классификация), и будет сохранена только часть извлечения признаков + глобальный средний пул.
ОБНОВЛЕНИЕ:
Разве VGG не кодирует пространственную информацию? Есть ли другая предварительно обученная сеть, которая ее сохраняет?
- VGG вместе с полносвязным YES кодирует пространственную информацию в слоях классификации. Это означает, что последние слои, например, если прогноз зависит от обнаружения неба выше, он рассматривается. С вами может случиться противоположный случай: если вы хотите классифицировать большое изображение с кошкой в левом верхнем углу как кошку, а вы тренировались только с изображениями кошек справа, тогда у вас могут возникнуть проблемы с пространственной информацией. Однако существуют и другие способы кодирования пространственной информации. Самым большим преимуществом полностью сверточных сетей является то, что вы можете использовать изображения разных размеров. Это зависит от задачи, в настоящее время широко используются полностью сверточные сети, что означает отсутствие преобразования сетки в плоский вектор. В противном случае все изображение усредняется, и пространственная информация теряется. Сейчас это стандарт.
Каково будет влияние include_top = False на сгенерированную карту объектов?
- Если это повлияет, с include_top = True вы сохраните все полносвязные слои, а затем сохраните fc2 (https://neurohive.io/wp-content/uploads/2018/11/vgg16.png). Если вы установите include_top = False, вы удалите FC и поместите слой глобального объединения средних значений, который будет усреднять все функции.
Какое лучшее решение? Лучшего решения нет, оно зависит от вашей проблемы и обычно не столь существенно.
person
Adria Ciurana
schedule
10.08.2020