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

How do I use input_shape and input_tensor in Transfer Learning in Keras?

当我们在 Keras2 中进行迁移学习时,Arguments 需要 "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) 被忽略了。

你能帮我一点忙吗?谢谢

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

当然,两者都没有意义。

  • 当您希望模型使用该尺寸自动创建自己的输入层时,您可以使用 input_shape
  • 当您有一个要作为输入的张量时,您可以使用 input_tensor

您可以在input_tensor中使用任何张量,这意味着使用其他models/layers的输出作为[=10=的输入].当然,你可以像你一样传递一个虚拟输入张量,代码没有理由抱怨,它收到了一个张量,好的。

唯一的问题是编码器忘记验证"if both arguments exist, thrown an error"。

实际上,当您设置 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.