Tensorflow 了解hub.KerasLayer的输入_形状参数

Tensorflow 了解hub.KerasLayer的输入_形状参数,tensorflow,keras,tensorflow-hub,Tensorflow,Keras,Tensorflow Hub,完成迁移学习后,可以使用tf中心的模型。比如MobilNetV2或者《盗梦空间》。这些模型需要一定大小的输入和图像。因此,在应用模型之前,必须将图像调整为该大小。在这种情况下,使用以下方法: feature_extractor_url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/2" feature_extractor_layer = hub.KerasLayer(feature_

完成迁移学习后,可以使用tf中心的模型。比如MobilNetV2或者《盗梦空间》。这些模型需要一定大小的输入和图像。因此,在应用模型之前,必须将图像调整为该大小。在这种情况下,使用以下方法:

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。我想知道
input\u shape=(224224,3)
。在这种情况下,预训练模型不加载hub KerasLayer,而是使用

base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                               include_top=False,
                                               weights='imagenet')
IMG_形状在哪里

IMG_SHAPE = (IMG_SIZE, IMG_SIZE, 3)
img_尺寸为160。所以这里输入的形状是input_shape=(160160,3)

现在回到问题上来:

feature_extractor_layer = hub.KerasLayer(feature_extractor_url,
                                         input_shape=(224,224,3))
我想知道input_shape参数到底告诉了我什么或做了什么?所以我不需要在这里输入224,对吗?我可以输入另一个尺寸,比如160,因为我的图像被调整到了这个尺寸?所以MobilNetV2确实期望224224,但是有了这个选项,我可以指定其他东西吗?对于
tf.keras.applications.mobilenetw2

可选形状元组,如果要使用模型,则要指定 输入图像分辨率不是(224、224、3)。它应该 正好有3个输入通道(2242243)。你也可以省略这个 选项,如果要从输入张量推断输入形状。如果 然后选择同时包含输入张量和输入形状 如果形状匹配或不匹配,将使用input_形状 然后我们将抛出一个错误。例如,(160,160,3)将是一个有效的 价值观

因此,当我将图像大小调整为300300并且我想使用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

当我检查初始图像时,图像的大小调整为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参数将此告诉模型?如上面提到的例子,图像大小为160。或者,如果我使用
tf.keras.applications.MobileNetV2
加载预训练的模型,但使用
hub.KerasLayer
我就不能这样做,这是一个很好的观察结果

TLDR,可以为
tf.keras.applications
模型
传递不同的
输入形状
,使用参数时,
包括_top=False
,但这在使用
tf.keras.applications
时是不可能的,
include_top=True
以及当我们使用
Tensorflow Hub的
模型时

详细说明

这说明

这就是原因,如果我们传递的是
图像形状
,而不是预期的形状,则会引发错误

 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: {}
ValueError: When setting `include_top=True` and loading `imagenet` 
weights, `input_shape` should be (224, 224, 3).
类似地,当我们在使用
tf.keras.applications
预训练模型
和参数
include_top=True
时传递不同的
输入形状时,它会引发一个错误

 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: {}
ValueError: When setting `include_top=True` and loading `imagenet` 
weights, `input_shape` should be (224, 224, 3).

但是如果我们在使用
tf.keras.applications
中的
预训练模型时设置参数值,
include_top=False
,那么
输入形状可以灵活,也就是说,对于MobileNetV2,我们可以传递列表中的任何形状,
[96、128、160、192、224]
)对于像
ResNet
VGGNet
这样的型号,我们可以传递任何
输入形状

,谢谢您的回答。不幸的是,这只有50%是正确的。“但是,如果我们使用tf.keras.applications中预先训练好的模型,那么输入_形状可以是灵活的,因为它已经在这些模型的源代码中处理过了。”这不是真的。只有以下值的图像大小是可能的:[96128160192224]。当我尝试运行tf.keras.applications.MobileNetV2(input_shape=(140,140,3),include_top=False,weights='imagenet')时,我遇到了一个错误:警告:tensorflow:
input_shape
未定义或非方形,或者
不在[96128160192224]。输入形状(224224224)的权重将作为默认值加载。