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

时间:2021-05-31 10:03:05

标签: tensorflow keras conv-neural-network tensorflow2.0

我正在使用 Xception 模型和在 ImageNet 上训练的预初始化权重,如下所示:

model = keras.applications.Xception(
    weights='imagenet',
    input_shape=(150,150,3)
)

现在我想获取特定层(按其名称,使用 model.get_layer(layerName)),然后将其权重重新初始化为完全随机的权重

最简单的方法是什么,如果可能的话?

1 个答案:

答案 0 :(得分:1)

你可以像这样使用重新初始化函数:

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(...)