调用Keras预训练模式,而不包括顶层的差异

问题描述 投票:1回答:1

什么叫有或没有包括模型的顶层的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    

我试图理解为什么是这样的,请评论

tensorflow keras keras-layer keras-2
1个回答
3
投票

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

注意权重的数量仍然是如何在两种情况下是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.