前培训Keras Xception和InceptionV3模型(Pre-training Keras

2019-09-26 03:38发布

我试图做使用Keras其内置预ImageNet CNN架构的简单的二元分类问题。

对于VGG16,我采取了以下做法,

vgg16_model = keras.application.vgg16.VGG16()

'''Rebuild the vgg16 using an empty sequential model'''
model = Sequential()
for layer in vgg16_model.layers:
    model.add(layer)

'''Since the problem is binary, I got rid of the output layer and added a more appropriate output layer.'''
model.pop()

'''Freeze other pre-trained weights'''
for layer in model.layers:
    layer.trainable = False

'''Add the modified final layer'''
model.add(Dense(2, activation = 'softmax'))

这比我定制CNN精度更高的工作奇妙。 但用了一段时间来训练,我想带使用Xception和InceptionV3因为他们以更高的精度较轻便的型号类似的方法。

xception_model = keras.applicaitons.xception.Xception()
model = Sequential()
for layer in xception_model.layers:
    model_xception.add(layer)

当我运行上面的代码,我得到以下错误:

ValueError: Input 0 is incompatible with layer conv2d_193: expected axis -1 of input shape to have value 64 but got shape (None, None, None, 128)

基本上,我愿做同样的事情,我VGG16模型做了; 保持其他预训练的权重,因为它们是与简单地修改输出层,以二元分类输出,而不是与1000分的结果的输出层。 我可以看到,不像VGG16,具有相对简单的卷积层结构,Xception和InceptionV3有一个我不熟悉的100%,一些时髦的节点,我假设这些都是造成问题。 如果任何人都可以帮忙排序的问题,它会非常感谢!

谢谢!

Answer 1:

您的代码会失败,因为InceptionV3XceptionSequential模式(即,它们包含“分支”)。 所以你不能只是添加多层分割成Sequential的容器中。

现在由于两个的顶层InceptionV3Xception由一个的GlobalAveragePooling2D层和最终Dense(1000)层,

if include_top:
    x = GlobalAveragePooling2D(name='avg_pool')(x)
    x = Dense(classes, activation='softmax', name='predictions')(x)

如果你想删除最后的致密层,你可以设置include_top=False加上pooling='avg'创建这些模型时。

base_model = InceptionV3(include_top=False, pooling='avg')
for layer in base_model.layers:
    layer.trainable = False
output = Dense(2, activation='softmax')(base_model.output)
model = Model(base_model.input, output)


文章来源: Pre-training Keras Xception and InceptionV3 models