在keras

时间:2018-03-05 10:26:02

标签: python keras keras-layer

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

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.summary()之后看model.layers.pop()似乎已从顶层弹出。但是,正在运行model.predict(X).shape仍会导致(20,1)形状而不是(20,3)

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

2 个答案:

答案 0 :(得分:1)

在这里找到答案: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

答案 1 :(得分:0)

    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
    ...

简单来说,您可以重建顺序模型