了解hub.KerasLayer的input_shape参数

时间:2020-07-11 14:13:10

标签: tensorflow keras tensorflow-hub

完成转移学习后,可以使用tf集线器中的模型。就像MobilNetV2或Inception。这些模型期望输入,并具有一定大小的图像。因此,在应用模型之前,必须将图像调整为该大小。在此tutorial中使用以下内容:

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)。在此tutorial中,预训练模型未加载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,我在documentation的确切位置上找到了答案:

可选的形状元组,如果您想使用模型则要指定 输入图像分辨率不是(224,224,3)。这应该 有3个输入通道(224、224、3)。您也可以忽略此 如果您想从input_tensor推断input_shape,请选择该选项。如果 您选择同时包含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?

当我检查implementation的初始图像时,图像将调整为299,299,然后使用以下代码:

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 个答案:

答案 0 :(得分:1)

这是一个很好的观察结果。

TLDR ,可以为Input Shapes的{​​{1}}和Models传递不同的tf.keras.applications,但这在我们使用时是不可能的include_top = False和参数tf.keras.applications,以及当我们使用include_top = True中的Models时。

详细说明

Tensorflow Hub Documentation声明

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: {} 的{​​{1}}和参数 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可以是灵活,即对于MobileNetV2,我们可以传递列表中的任何形状tf.keras.applications),对于Input_Shape[96, 128, 160, 192, 224]之类的模型,我们可以传递任何{{1 }}。