预训练Keras Xception和InceptionV3模型

时间:2018-02-20 17:15:58

标签: python tensorflow deep-learning keras

我正在尝试使用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不同,VGG16具有相对简单的卷积层结构,Xception和InceptionV3有一些我不是100%熟悉的时髦节点,而且我认为这些节点会引起问题。如果有人可以帮助解决问题,那就非常感激了!

谢谢!

1 个答案:

答案 0 :(得分:2)

您的代码失败,因为InceptionV3Xception不是Sequential模型(即,它们包含"分支")。因此,您无法将图层添加到Sequential容器中。

现在,由于InceptionV3Xception的顶层都包含GlobalAveragePooling2D图层和最终的Dense(1000)图层,

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

如果要删除最终的密集图层,则可以在创建这些模型时设置include_top=Falsepooling='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)