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
...
我想弹出模型的最后一层。所以我使用 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
...