在keras中弹出上层
Popping upper layers in keras
假设我有以下预训练模型:
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.layers.pop()
之后看 model.summary()
似乎已经从顶层弹出。但是,运行ning model.predict(X).shape
仍然会导致 (20,1)
形状,而不是预期的 (20,3)
。
问题:我应该如何正确地pop
关闭最后几层。这是一个人为的例子。在我的例子中,我需要删除最后 3 层。
在这里找到答案: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
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
...
很简单,你可以重构Sequential模型
假设我有以下预训练模型:
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.layers.pop()
之后看 model.summary()
似乎已经从顶层弹出。但是,运行ning model.predict(X).shape
仍然会导致 (20,1)
形状,而不是预期的 (20,3)
。
问题:我应该如何正确地pop
关闭最后几层。这是一个人为的例子。在我的例子中,我需要删除最后 3 层。
在这里找到答案: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
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 ...
很简单,你可以重构Sequential模型