如何在预训练的模型中随机初始化层



我正在使用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(...)

最新更新