如何在Keras中为Inception V3自定义input_shape?

x6yk4ghg  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(182)

我知道Inception V3的input_shape(299,299,3),但在Keras中,如果include_topFalse,则可以构建具有自定义input_shape的Inception V3版本。
“输入形状:可选形状元组,仅当include_topFalse时才指定(否则输入形状必须为(299, 299, 3)(具有'channels_last'数据格式)或(3, 299, 299)(具有'channels_first'数据格式))。它应正好具有3个输入通道,宽度和高度应不小于75。例如,(150, 150, 3)将是一个有效值”- www.example.com
这是怎么可能的?为什么只有当include_topfalse时,它才能有自定义的input_shape?

wlzqhblo

wlzqhblo1#

这是可能的,因为模型是完全卷积的。卷积不关心图像大小,它们是“滑动滤波器”。如果你有大图像,你有大输出,如果小图像,小输出。(滤波器,虽然,有一个固定的大小定义为kernel_size和输入和输出滤波器)
使用include_top时无法执行此操作,因为此模型可能使用Flatten()图层,最后使用Dense图层。Dense图层需要固定的输入大小(通过基于图像大小的展平来指定),否则将无法创建可训练的权重(具有可变数量的权重没有意义)

wnvonmuf

wnvonmuf2#

为了理解这一点,你应该清楚卷积是如何工作的。就像丹尼尔·默勒说的,如果图像大小改变,卷积输出大小也会改变。要点是你不能在预先训练的模型上使用自定义图像大小,因为参数是固定的。
例如,在您的情况下,inception v3使用全局平均池,然后是最后一个卷积层之后的密集层。由于它是预先训练的模型,因此密集层始终期望来自全局平均池的输入大小相同。

mixed10 (Concatenate)          (None, 8, 8, 2048)   0           ['activation_743[0][0]',         
                                                              'mixed9_1[0][0]',               
                                                              'concatenate_15[0][0]',         
                                                              'activation_751[0][0]']         
                                                                                              
avg_pool (GlobalAveragePooling  (None, 2048)        0           ['mixed10[0][0]']                
 2D)                                                                                              
                                                                                              
 predictions (Dense)            (None, 1000)         2049000     ['avg_pool[0][0]']

它总是期望全局平均池中的值为2048。这就是为什么您不能使用include_top=Trueweights='imagenet'的自定义图像大小。但是,如果include_top=Falseweights=None,您可以使用自定义图像大小,因为您正在初始化取决于您的图像大小的参数。
您可以像这样实现自定义图像大小

a=tf.keras.applications.inception_v3.InceptionV3(include_top=False,weights=None,
input_shape=(256,256,4))

x=tfa.layers.SpectralNormalization(layers.Conv2D(filters=64, kernel_size= 
(3,3),strides=(2,2),padding='same',activation="LeakyReLU",name='ls_1'))(a.output)

x=layers.Dropout(0.3)(x)
x=keras.Model(inputs=a.input,outputs=x)
bd1hkmkf

bd1hkmkf3#

Keras API reference / Keras Applications文档包含带有自定义输入Tensor的include_top=True
从文档中:
在自定义输入Tensor上构建InceptionV3

from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.layers import Input

# this could also be the output a different Keras model or layer
input_tensor = Input(shape=(224, 224, 3))

model = InceptionV3(input_tensor=input_tensor, weights='imagenet', include_top=True)

相关问题