如何使用keras.applications中的模型进行转移学习?

发布于 2021-01-29 15:10:34

我想在Keras中获得预训练的VGG16模型,删除其输出层,然后放置一个具有适合我的问题的类数的新输出层,然后使其适合新数据。出于这个原因,我试图在这里使用该模型:https
:
//keras.io/applications/#vgg16,但是由于它不是顺序的,所以我不能只是model.pop()。从图层弹出并添加它也是行不通的,因为在预测中它仍然希望使用旧形状。我该怎么办?有没有办法将这种类型的模型转换为Sequential

关注者
0
被浏览
65
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用pop()on model.layers,然后使用model.layers[-1].output来创建新层。

    例:

    from keras.models import Model
    from keras.layers import Dense,Flatten
    from keras.applications import vgg16
    from keras import backend as K
    
    model = vgg16.VGG16(weights='imagenet', include_top=True)
    
    model.input
    
    model.summary(line_length=150)
    
    model.layers.pop()
    model.layers.pop()
    
    model.summary(line_length=150)
    
    new_layer = Dense(10, activation='softmax', name='my_dense')
    
    inp = model.input
    out = new_layer(model.layers[-1].output)
    
    model2 = Model(inp, out)
    model2.summary(line_length=150)
    

    或者,您可以使用include_top=False这些模型的选项。在这种情况下,如果您需要使用平坦化图层,则需要传递图层input_shape

    model3 = vgg16.VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
    model3.summary(line_length=150)
    
    flatten = Flatten()
    new_layer2 = Dense(10, activation='softmax', name='my_dense_2')
    
    inp2 = model3.input
    out2 = new_layer2(flatten(model3.output))
    
    model4 = Model(inp2, out2)
    model4.summary(line_length=150)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看