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

qin*_*ong 7 python tensorflow tensorflow2.0

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

base_model.summary()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

base_model.layers.pop()

base_model.summary()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

base_model.summary()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

base_model._layers.pop()
base_model.summary()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

Ste*_*t_R 10

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

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

new_model = tf.keras.models.Sequential(base_model.layers[:-1])
Run Code Online (Sandbox Code Playgroud)

查看此github 问题以获取更多详细信息


Dan*_*Lee 5

@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
...
Run Code Online (Sandbox Code Playgroud)