在keras中弹出上层

Popping upper layers in keras

假设我有以下预训练模型:

from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(3, activation='relu', input_dim=5))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')

当我 运行 通过以下数据 (X) 时,我得到了预期的形状:

import numpy as np
X = np.random.rand(20, 5)
model.predict(X).shape

给出形状 (20,1)

但是,为了迁移学习的目的,我希望通过相同的数据弹出顶层并运行它。

model.layers.pop()
model.summary()
>>>
Layer (type)                 Output Shape              Param #   
=================================================================
dense_3 (Dense)              (None, 3)                 18        
=================================================================
Total params: 18
Trainable params: 18
Non-trainable params: 0

model.layers.pop() 之后看 model.summary() 似乎已经从顶层弹出。但是,运行ning model.predict(X).shape 仍然会导致 (20,1) 形状,而不是预期的 (20,3)

问题:我应该如何正确地pop关闭最后几层。这是一个人为的例子。在我的例子中,我需要删除最后 3 层。

在这里找到答案:https://github.com/keras-team/keras/issues/8909

以下是需要的答案。不幸的是,必须创建第二个模型,并且出于某种原因,@Eric 的回答似乎不再像另一个 github 问题中所建议的那样起作用。

model.layers.pop()
model2 = Model(model.input, model.layers[-1].output)
model2.predict(X).shape
    loaded_model = keras.models.load_model(fname)

    # remove the last 2 layers
    sliced_loaded_model = Sequential(loaded_model.layers[:-2])

    # set trainable=Fasle for the layers from loaded_model
    for layer in sliced_loaded_model.layers:
        layer.trainable = False

    # add new layers
    sliced_loaded_model.add(Dense(32, activation='relu'))  # trainable=True is default
    sliced_loaded_model.add(Dense(1))

    # compile
    sliced_loaded_model.compile(loss='mse', optimizer='adam', metrics=[])

    # fit
    ...

很简单,你可以重构Sequential模型