gpt4 book ai didi

tensorflow - 在不包括顶层的情况下调用 Keras 预训练模型的区别

转载 作者:行者123 更新时间:2023-12-02 17:00:12 26 4
gpt4 key购买 nike

调用包含或不包含模型顶层的 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

我想弄明白为什么会这样,欢迎评论

最佳答案

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

请注意在这两种情况下权重的数量是如何保持不变的。

关于tensorflow - 在不包括顶层的情况下调用 Keras 预训练模型的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54502075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com