Я хочу получить предварительную модель VGG16 в Keras, удалить ее выходной слой, а затем добавить новый выходной слой с количеством классов, подходящих для моей проблемы, а затем поместить его на новые данные. По этой причине я пытаюсь использовать модель здесь: https://keras.io/applications/#vgg16, но поскольку это не Sequential, я не могу просто model.pop()
. Поппинг из слоев и добавление его также не работает, потому что в прогнозах он все еще ожидает старую форму. Как мне это сделать? Есть ли способ конвертировать этот тип модели в Sequential
?
Как использовать модели от keras.приложений для передачи обучения?
Ответ 1
Вы можете использовать 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
.
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)