TensorFlow Keras использует модель MobileNetV2 с входами менее 32x32

Я хочу использовать модель MobileNetV2 без утяжелителей размером менее 32x32. Если я попробую

model = tf.keras.applications.MobileNetV2(input_shape=(10,10,3),include_top=False,weights=None)

дает ошибку

ValueError: Input size must be at least 32x32; got `input_shape=(10, 10, 3)

Я понимаю, что не могу использовать все слои, потому что разрешение модели слишком сильно уменьшается, поэтому предположим, что я хочу использовать первые 30 слоев модели.

Как я могу создать модель, которая использует первые 30 слоев MobileNetV2 и имеет форму ввода 10x10x3? Я не хочу вручную создавать модель MobileNetV2, но я хочу использовать метод tf.keras.applications.MobileNetV2 для ее загрузки.


person user3731622    schedule 30.03.2021    source источник


Ответы (1)


Создайте новую модель из MobileNet с первыми 30 слоями в качестве выходных данных (т.е. модель с несколькими выходами). Вот как:

base = tf.keras.applications.MobileNetV2(include_top=False,weights=None)
features_list = [layer.output for layer in base.layers[:30]]
model = keras.Model(inputs=base.input, outputs=features_list)

len(model.layers) # 30

Тестовое задание

img = np.random.random((1, 10, 10, 3)).astype("float32")
model(img)

[<tf.Tensor: shape=(1, 10, 10, 3), dtype=float32, numpy=
 array([[[[0.7529889 , 0.18826886, 0.9792667 ],
          [0.52218866, 0.36510527, 0.4743469 ],
...
...

На основании вашего комментария. Мы можем это сделать. Вот как это сделать, если вы хотите, чтобы модель имела единственный выход, который является выходом 30-го уровня модели MobileNetV2.

from keras import layers
input_s = layers.Input((10,10,3))

import tensorflow as tf 
base = tf.keras.applications.MobileNetV2(include_top=False,
                                         weights=None,  
                                         input_tensor = input_s)

from tensorflow import keras
model = keras.Model(inputs=base.input, outputs=base.layers[30].output)
model.summary()
...
...
person M.Innat    schedule 30.03.2021
comment
Мне не нужна модель с несколькими выходами. Я думаю, что нельзя указывать input_shape в tf.keras.applications.MobileNetV2 и использовать new_model = tf.keras.Model(inputs=model.inputs, outputs=model.layers[:30].output). Однако new_model будет иметь входной слой с выходной формой (None,None,None,3). Есть ли способ сделать так, чтобы это было (None,10,10,3)? - person user3731622; 30.03.2021
comment
насколько я могу судить по applications.Mob.., это кажется невозможным. Хотя я не совсем уверен. и я также не вижу проблем с (None,None,None,3). - person M.Innat; 30.03.2021
comment
Я обновил ответ, думаю, это то, что вы ищете. - person M.Innat; 30.03.2021
comment
Я не знал об аргументе input_tensor. Это полезно. Однако, как я уже упоминал, мне не нужна модель с несколькими выходами (каков ваш текущий ответ). Если вы избавитесь от всего features_list и просто воспользуетесь model = keras.Model(inputs=base.input, outputs=base.layers[30].output), то это тот ответ, который я искал. Если вы измените свой ответ, я приму ответ. Спасибо!!!! - person user3731622; 30.03.2021
comment
Решает ли данный ответ вашу проблему? Если да, отметьте это как правильный ответ или не стесняйтесь спрашивать, если у вас возникнут какие-либо проблемы. Спасибо. - person M.Innat; 02.04.2021