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