tf.keras.layers.pop()不起作用,但tf.keras._layers.pop()起作用

时间:2019-08-01 20:27:44

标签: python tensorflow tensorflow2.0

我想弹出模型的最后一层。因此我使用了tf.keras.layers.pop(),但是它不起作用。

base_model.summary()

enter image description here

base_model.layers.pop()

base_model.summary()

enter image description here

当我使用tf.keras._layers.pop()时,它可以工作。

base_model.summary()

enter image description here

base_model._layers.pop()
base_model.summary()

enter image description here

我找不到有关此用法的文档。有人可以帮忙解释一下吗?

2 个答案:

答案 0 :(得分:0)

我同意这令人困惑。原因是model.layers返回了层列表的浅表副本,因此:

tldr不要使用model.layers.pop()删除最后一层。相反,我们应该使用除最后一层之外的所有层创建一个新模型。也许是这样的:

new_model = tf.keras.models.Sequential(base_model.layers[:-1])

查看此github issue以获得更多详细信息

答案 1 :(得分:0)

@Stewart_R清楚地显示了解决问题的方法:)

让我在解决方案中放一个简单的代码。

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