如何在 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
参数将被忽略。 Here 是 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
.
当我们在 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
参数将被忽略。 Here 是 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
.