完成转移学习后,可以使用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
时却无法做到?
答案 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 }}。