是什么调用具有或不包括该模型的顶层的VGG16模型的差异?我想知道,为什么在模型摘要未显示的输入参数层时,模型被称为不包括顶层。余应用于以下两种方式VGG16模型:
from keras.applications import vgg16
model = vgg16.VGG16(weights='imagenet', include_top=False)
print(model.summary)
模型中各层的形状未显示任何输入,即(无,无,无,64),请参见下文
Layer (type) Output Shape Param
===================================================================
block1_conv1 (Conv2D) (None, None, None, 64) 1792
block1_conv2 (Conv2D) (None, None, None, 64) 36928
block1_pool (MaxPooling2D) (None, None, None, 64) 0
但是,以下代码返回输入参数
from keras.applications import vgg16
model = vgg16.VGG16()
print(model.summary)
在这种情况下,图层的形状将返回输入参数
Layer (type) Output Shape Param
==================================================================
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
block1_pool (MaxPooling2D) (None, 112, 112, 64) 0
我试图理解为什么会这样,请发表评论
答案 0 :(得分:2)
VGG的顶层完全连接的,其被连接到卷积碱的输出层。这些包含固定数量的节点,可以选择使用在imagenet上预训练的权重实例化它们。因此,当实例化包含顶层的VGG模型时,体系结构的大小是固定的,并且该模型将仅接受输入大小固定为(224,224,3)的图像。 用其他尺寸的图像填充网络会改变密集的分类层中的权重数量。
但是,当您忽略顶部分类器时,您将能够将大小不同的图像馈送到网络,并且卷积堆栈的输出将相应地发生变化。这样,您可以将VGG架构应用于您选择的大小的图像,并在其顶部粘贴您自己的密集连接的分类器。 与密集层相比,卷积层中的权重数量保持不变,只是它们输出的形状发生了变化。
实例化没有顶层但具有特定输入形状的VGG模型时,您会注意到所有这一切:
from keras.applications import vgg16
model = vgg16.VGG16(include_top=False, input_shape=(100,100,3))
model.summary()
会产生:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_4 (InputLayer) (None, 100, 100, 3) 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 100, 100, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (None, 100, 100, 64) 36928
_________________________________________________________________
block1_pool (MaxPooling2D) (None, 50, 50, 64) 0
_____________________________________________________________
etc.
有趣的是,当您用不同的输入形状调用体系结构时,卷积层的输出形状如何变化。对于以上示例,我们得到:
block5_conv3 (Conv2D) (None, 6, 6, 512) 2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (None, 3, 3, 512) 0
=================================================================
Total params: 14,714,688
Trainable params: 14,714,688
Non-trainable params: 0
如果您使用形状为(400,400,3)的图像实例化体系结构,则会得到以下输出:
_________________________________________________________________
block5_conv3 (Conv2D) (None, 25, 25, 512) 2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (None, 12, 12, 512) 0
=================================================================
Total params: 14,714,688
Trainable params: 14,714,688
Non-trainable params: 0
请注意,两种情况下的权重数量如何保持相同。