TensorFlow Keras 使用输入小于 32x32 的 MobileNetV2 模型

TensorFlow Keras Use MobileNetV2 Model with Inputs less than 32x32

我想使用尺寸小于 32x32 的没有权重的 MobileNetV2 模型。如果我尝试

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 个层。

如何创建使用 MobileNetV2 的前 30 层并具有 10x10x3 输入形状的模型?我不想手动创建MobileNetV2模型,而是想用tf.keras.applications.MobileNetV2方式加载

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 ],
...
...

根据您的评论。我们能做到这一点。如果您希望模型具有单个输出,即 MobileNetV2 模型第 30 层的输出,请执行以下操作。

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