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

tf.keras.layers.pop() doesn't work, but tf.keras._layers.pop() does

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

base_model.summary()

base_model.layers.pop()

base_model.summary()

当我使用 tf.keras._layers.pop() 时,它有效。

base_model.summary()

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

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

我同意这令人困惑。原因是 model.layers returns 层列表的浅拷贝所以:

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

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

查看此github issue了解更多详情

@Stewart_R 清楚地说明了问题的解决方法:)

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

loaded_model = keras.models.load_model(fname)
    
# remove the last 2 layers
sliced_loaded_model = Sequential(loaded_model.layers[:-2])
    
# set trainable=False 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
...