如何在Keras的转移学习中使用input_shape和input_tensor?

时间:2019-07-05 06:46:56

标签: python machine-learning keras deep-learning transfer-learning

当我们在Keras2。中进行转移学习时,参数需要“ input_shape”和“ input_tensor”。但是我只使用input_tensor,从未使用过input_shape。我认为仅input_tensor就足够了,我不知道何时使用input_shape。 我应该如何单独使用它们?

我同时使用input_tensor和input_shape并使用单独的值,并且仅采用input_tensor的值,而忽略了input_shape。

vgg16_model = VGG16(include_top=False, weights='imagenet', 
                    input_tensor = Input(shape=(150, 150, 3)), 
                    input_shape=(224,224,3))

top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dense(1, activation='sigmoid'))
model = Model(input=vgg16_model.input, output=top_model(vgg16_model.output))

model.summary()
Layer (type)                 Output Shape              Param #   
================================================================
input_6 (InputLayer)         (None, 150, 150, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 150, 150, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 150, 150, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 75, 75, 64)        0         
_________________________________________________________________
block2_conv......

我希望这段代码会出错,但是没有错误,并且该模型可以接受(150,150,3)的形状。 Input_shape =(224,224,3)被忽略了。

您能给我一点帮助吗?谢谢。

2 个答案:

答案 0 :(得分:0)

VGG16代码可能只是忘了检查两个参数。

当然,两者都没有意义。

  • 当您希望模型以该大小自动创建自己的输入层时,可以使用input_shape
  • 当您要输入张量时使用input_tensor

您可以在input_tensor中使用 any 张量,这意味着可以将其他模型/图层的输出用作VGG16的输入。当然,您可以像以前那样传递虚拟输入张量,没有理由让代码抱怨,它收到了张量,好的。

唯一的问题是,编码人员忘记了验证“如果两个参数都存在,则抛出错误”。

答案 1 :(得分:0)

实际上,当您设置input_tensor参数时,给定的张量(假设它是Keras张量)将用于输入,因此input_shape参数将被忽略。 Herekeras-applications源代码中的相关部分:

if input_tensor is None:
    img_input = layers.Input(shape=input_shape)
else:
    if not backend.is_keras_tensor(input_tensor):
        img_input = layers.Input(tensor=input_tensor, shape=input_shape)
    else:
        img_input = input_tensor

如您所见,在最后一行中,给定的input_tensor将用于输入张量,而无需考虑input_shape