Tensorflow 不包含顶层调用Keras预训练模型的差异

Tensorflow 不包含顶层调用Keras预训练模型的差异,tensorflow,keras,keras-layer,keras-2,Tensorflow,Keras,Keras Layer,Keras 2,调用VGG16模型(包括或不包括模型的顶层)有什么区别?我想知道,当调用模型而不包括顶层时,为什么层的输入参数没有显示在模型摘要中。我通过以下两种方式使用VGG16模型: from keras.applications import vgg16 model = vgg16.VGG16(weights='imagenet', include_top=False) print(model.summary) 模型中图层的形状不显示任何输入,即(无、无、无、64),请参见下文 Layer (type)

调用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    
在本例中,层的形状返回输入参数

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    

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

VGG的顶层是完全连接的层,连接到卷积基的输出。这些节点包含固定数量的节点,可以选择在imagenet上使用预先训练的权重来实例化它们。当实例化包含顶层的VGG模型时,架构的大小因此是固定的,并且模型将只接受固定输入大小为(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
如果用形状(400400,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
请注意,在这两种情况下,权重的数量如何保持相同