我正在使用Xception模型,该模型具有在ImageNet上训练的预初始化权重,如下所示:
model = keras.applications.Xception(
weights='imagenet',
input_shape=(150,150,3)
)
现在我想取特定的层(按其名称,使用model.get_layer(layerName)
(,然后将其权重重新初始化为完全随机的一个。
最简单的方法是什么?如果可能的话?
您可以使用这样的重新初始化函数:
def reinitialize_layer(model, initializer, layer_name):
layer = model.get_layer(layer_name)
layer.set_weights([initializer(shape=w.shape) for w in layer.get_weights()])
您也可以使用图层索引来代替layer_name
。如果您想重新初始化多个图层,也可以扩展该函数,使其获得图层名称列表。
用法示例:
import keras
model = keras.applications.Xception(
weights='imagenet',
input_shape=(299,299,3)
)
# zeros as illustrative example, change to something else
initializer = keras.initializers.Zeros()
# check pretrained weights
print(model.get_layer("predictions").get_weights())
# change "predictions" to whatever layer name you like to use instead
reinitialize_layer(model, initializer, "predictions")
# check weights after reinitialization
print(model.get_layer("predictions").get_weights())
model.compile(...)
model.fit(...)