我知道Inception V3的input_shape
是(299,299,3)
,但在Keras中,如果include_top
是False
,则可以构建具有自定义input_shape
的Inception V3版本。
“输入形状:可选形状元组,仅当include_top
为False
时才指定(否则输入形状必须为(299, 299, 3)
(具有'channels_last'
数据格式)或(3, 299, 299)
(具有'channels_first'
数据格式))。它应正好具有3个输入通道,宽度和高度应不小于75。例如,(150, 150, 3)
将是一个有效值”- www.example.com
这是怎么可能的?为什么只有当include_top
是false
时,它才能有自定义的input_shape?
3条答案
按热度按时间wlzqhblo1#
这是可能的,因为模型是完全卷积的。卷积不关心图像大小,它们是“滑动滤波器”。如果你有大图像,你有大输出,如果小图像,小输出。(滤波器,虽然,有一个固定的大小定义为
kernel_size
和输入和输出滤波器)使用
include_top
时无法执行此操作,因为此模型可能使用Flatten()
图层,最后使用Dense
图层。Dense
图层需要固定的输入大小(通过基于图像大小的展平来指定),否则将无法创建可训练的权重(具有可变数量的权重没有意义)wnvonmuf2#
为了理解这一点,你应该清楚卷积是如何工作的。就像丹尼尔·默勒说的,如果图像大小改变,卷积输出大小也会改变。要点是你不能在预先训练的模型上使用自定义图像大小,因为参数是固定的。
例如,在您的情况下,inception v3使用全局平均池,然后是最后一个卷积层之后的密集层。由于它是预先训练的模型,因此密集层始终期望来自全局平均池的输入大小相同。
它总是期望全局平均池中的值为2048。这就是为什么您不能使用include_top=True和weights='imagenet'的自定义图像大小。但是,如果include_top=False和weights=None,您可以使用自定义图像大小,因为您正在初始化取决于您的图像大小的参数。
您可以像这样实现自定义图像大小
bd1hkmkf3#
Keras API reference / Keras Applications文档包含带有自定义输入Tensor的
include_top=True
。从文档中:
“在自定义输入Tensor上构建InceptionV3”