Понимание параметра input_shape в hub.KerasLayer - PullRequest
0 голосов
/ 11 июля 2020

Когда переносное обучение выполнено, можно использовать модель из концентратора tf. Как MobilNetV2 или Inception. Эти модели ожидают входов, изображений определенного размера. Таким образом, перед применением моделей необходимо изменить размер изображений до этого размера. В этом учебнике используется следующее:

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))

В этом примере изображения уже были изменены до 224 224 ранее. Меня интересует input_shape=(224,224,3). В этом учебнике предварительно обученная модель не загружается с помощью hub-KerasLayer, а вместо этого используется

base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                               include_top=False,
                                               weights='imagenet')

, где IMG_SHAPE - это

IMG_SHAPE = (IMG_SIZE, IMG_SIZE, 3)

, а img_size - 160. Итак, здесь input_shape - input_shape = (160,160,3).

Теперь вернемся к:

feature_extractor_layer = hub.KerasLayer(feature_extractor_url,
                                         input_shape=(224,224,3))

Мне было интересно, что именно параметр input_shape говорит мне или делает? Так что мне не нужно вводить здесь 224 224, верно? Я мог ввести другой размер, например 160, потому что мои изображения были изменены до этого размера? Итак, MobilNetV2 ожидает 224 224, но с этой опцией я могу указать что-то еще? Для tf.keras.applications.MobileNetV2 я нашел документацию , где это точно объясняет:

Необязательный кортеж формы, который нужно указать, если вы хотите использовать модель с разрешением входного изображения, которое не (224, 224, 3). У него должно быть ровно 3 входных канала (224, 224, 3). Вы также можете опустить эту опцию, если хотите вывести input_shape из input_tensor. Если вы решите включить и input_tensor, и input_shape, тогда input_shape будет использоваться, если они совпадают, если формы не совпадают, мы выдадим ошибку. Например, (160, 160, 3) будет одним допустимым значением.

Итак, когда я изменил размер своих изображений до 300,300 и хочу использовать MobileNetV2, могу ли я использовать следующий код:

 feature_extractor_url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/2" 
    
    feature_extractor_layer = hub.KerasLayer(feature_extractor_url,
                                             input_shape=(300,300,3))

Или мне нужно изменить размер до 224,224 и ввести здесь 224,224?

Когда я проверяю реализацию для начала, размеры изображений изменяются до 299299, а затем используется следующий код :

IMAGE_RES = 299

feature_extractor = hub.KerasLayer(URL,
  input_shape=(IMAGE_RES, IMAGE_RES, 3),
  trainable=False)

Обязательно ли это делать именно на 299? Или я мог бы также изменить размер до другого размера, например 250, и ввести это в качестве ввода:

   IMAGE_RES = 250

feature_extractor = hub.KerasLayer(URL,
  input_shape=(IMAGE_RES, IMAGE_RES, 3),
  trainable=False)

Таким образом, предварительно обученные модели ожидают определенного фиксированного размера, и этот параметр input_shape существует, чтобы сделать его гибким в случае пользователь хочет использовать другой размер, верно? Но тогда почему все эти примеры меняют размер в точности до размера, предполагаемого моделью? Я мог бы сделать это и с другим размером, верно? Итак, во всех примерах говорится, что модели ожидают этого, и я понимаю это так, что мы должны изменять размер в точности так, как ожидает модель. Но параметр input_shape существует именно для этого, чтобы сделать его гибким, так что мне не нужно изменять размер в точности так, как ожидает модель, а вместо этого просто изменить размер до того, что я хочу, и с параметром input_shape я сообщаю это модели? Как в упомянутом примере с размером изображения 160. Или это возможно в случае, если я использую tf.keras.applications.MobileNetV2 для загрузки предварительно обученных моделей, но при использовании hub.KerasLayer я не могу этого сделать?

1 Ответ

1 голос
/ 16 июля 2020

Это хорошее наблюдение.

TLDR , другие Input Shapes могут быть переданы для Models из tf.keras.applications с аргументом include_top = False, но это невозможно когда мы используем tf.keras.applications с аргументом include_top = True и когда мы используем Models из Tensorflow Hub.

Подробное объяснение :

Это В документации к Tensorflow Hub указано

> The height and width dimensions are fixed to the expected size of
> input images. (Future work may remove that restriction for fully
> convolutional modules.)

Вот почему, если мы передадим Image Shape, отличное от ожидаемой формы, возникнет ошибка

 Expected these arguments to match one of the following 4 option(s):
    
    Option 1:
      Positional arguments (4 total):
        * TensorSpec(shape=(None, 224, 224, 3), dtype=tf.float32, name='inputs')
        * True
        * False
        * TensorSpec(shape=(), dtype=tf.float32, name='batch_norm_momentum')
      Keyword arguments: {}
    
    Option 2:
      Positional arguments (4 total):
        * TensorSpec(shape=(None, 224, 224, 3), dtype=tf.float32, name='inputs')
        * True
        * True
        * TensorSpec(shape=(), dtype=tf.float32, name='batch_norm_momentum')
      Keyword arguments: {}
    
    Option 3:
      Positional arguments (4 total):
        * TensorSpec(shape=(None, 224, 224, 3), dtype=tf.float32, name='inputs')
        * False
        * True
        * TensorSpec(shape=(), dtype=tf.float32, name='batch_norm_momentum')
      Keyword arguments: {}
    
    Option 4:
      Positional arguments (4 total):
        * TensorSpec(shape=(None, 224, 224, 3), dtype=tf.float32, name='inputs')
        * False
        * False
        * TensorSpec(shape=(), dtype=tf.float32, name='batch_norm_momentum')
      Keyword arguments: {}

Аналогично, когда мы передаем разные Input Shape при использовании Pre-Trained Models из tf.keras.applications с аргументом include_top = True (включая плотные слои наверху), это вызывает ошибку

ValueError: When setting `include_top=True` and loading `imagenet` 
weights, `input_shape` should be (224, 224, 3).

Но если мы установим значение аргумента include_top = False при использовании Pre-Trained Models из tf.keras.applications, Input_Shape может быть гибким т.е. MobileNetV2, мы можем передать любую фигуру из списка, [96, 128, 160, 192, 224]), а для таких моделей, как ResNet или VGGNet, мы можем передать любую Input Shape.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...