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

4
在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)被忽略了。
您需要帮助吗?谢谢。

当完全连接的分类层没有使用时,这两个参数都是可选的。这些模型可以接受大小不定的输入,但输出也会随之变化。 - JimmyOnThePage
谢谢!但我还有一个问题。我添加了代码的详细信息。 什么时候必须使用input_shape而不是input_tensor? - Kai.K
2个回答

6

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

当然,同时具有这两个参数是没有意义的。

  • 使用input_shape时,您希望模型自动创建一个输入层,并具有该大小。
  • 使用input_tensor时,您已经有一个张量作为输入。

您可以在input_tensor中使用任何张量,这是为了使用其他模型/层的输出作为VGG16的输入。当然,您可以像之前那样传递虚拟输入张量,因为代码没有抱怨,它接收到了一个张量,没问题。

唯一需要注意的是,编码器忘记验证“如果两个参数都存在,则抛出错误”。


1
非常感谢!我找到了连接其他模型/层的方法。 Keras存在一些错误。 - Kai.K

2
实际上,当您设置input_tensor参数时,给定的张量(假设它是Keras张量)将用于输入,因此input_shape参数将被忽略。 这里keras-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

对于else语句中的fits if语句,我不确定逻辑的含义。如果input_tensor不是keras_tensor,则我们希望张量的占位符等于输入张量?为什么会这样呢?谢谢。 - IntegrateThis
2
@IntegrateThis 如果它是一个Keras张量,那么它意味着它连接到一个层/模型,从那里它可以取值;因此,直接使用它是可以的。然而,如果它不是一个Keras张量,它应该被包装在一个“Input”层中,以便可以使用“placeholder”(这是“Input”层的基本结构)来提供(即获取)值。 - today

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接