如何从预训练的模型中删除最后一层。我已经尝试过model.layers.pop()但它不起作用

时间:2019-03-25 09:59:37

标签: python keras keras-layer tf.keras

我正在尝试删除最后一层,以便可以使用转移学习。

subForm

但是我得到的输出不是我期望的。它仍在显示vgg16模型的最后一层。

这是输出

vgg16_model = keras.applications.vgg16.VGG16()
model = Sequential()

for layer in vgg16_model.layers:
    model.add(layer)

model.layers.pop()


# Freeze the layers 
for layer in model.layers:
    layer.trainable = False


# Add 'softmax' instead of earlier 'prediction' layer.
model.add(Dense(2, activation='softmax'))


# Check the summary, and yes new layer has been added. 
model.summary()

注意-在输出中,我没有显示整个模型,只是显示了前几层和最后一层。

我应该如何删除最后一层以进行迁移学习?

P.S Keras版本= 2.2.4

2 个答案:

答案 0 :(得分:1)

首先不要将最后一层添加到模型中。这样,您甚至不需要pop

vgg16_model = keras.applications.vgg16.VGG16()
model = Sequential()

for layer in vgg16_model.layers[:-1]: # this is where I changed your code
    model.add(layer)    

# Freeze the layers 
for layer in model.layers:
    layer.trainable = False

# Add 'softmax' instead of earlier 'prediction' layer.
model.add(Dense(2, activation='softmax'))

答案 1 :(得分:0)

对于markuscosinus答案,您也可以在预测层之前获取输出,然后将其传递给您自己的预测层。您可以按照以下步骤进行操作:

for layer in vgg16_model.layers: 
    layer.trainable = False
last_layer = vgg16_model.get_layer('fc2').output
out = Flatten()(last_layer)
out = Dense(128, activation='relu', name='fc3')(out)
out = Dropout(0.5)(out)
out = Dense(n_classes, activation='softmax', name='prediction')(out)
vgg16_custom_model = Model(input=vgg16_model.input, output=out)

我建议您在softmax之前添加一个Flatten和另一个Dense层,因为最后一个“ fc2”具有4096个节点,很难将其更改为2。

当然,在预测之前辍学会给您带来更好的收获。