如何在Keras中重新初始化现有模型的层权?

时间:2019-06-17 11:15:53

标签: tensorflow keras conv-neural-network

实际的问题是为Keras中的现有(已构建)模型生成随机层权重。有一些使用Numpy [2]的解决方案,但是选择该解决方案并不是很好。因为在Keras中,有一些特殊的初始化程序会为每种图层类型使用不同的分布。当使用Numpy代替初始值设定项时,生成的权重与其原始值的分布不同。让我们举个例子:

模型的第二层是卷积(1D)层,其初始值设定项是GlorotUniform [1]。如果使用Numpy生成随机权重,则生成的权重的分布将不是GlorotUniform。

我有解决此问题的方法,但有一些问题。这是我所拥有的:

def set_random_weights(self, tokenizer, config):
    temp_model = build_model(tokenizer, config)
    self.model.set_weights(temp_model.get_weights())

我正在构建现有模型。构建过程完成后,将重新初始化模型的权重。然后,我得到重新初始化的权重并将其设置为另一个模型。用于生成新权重的构建模型具有多余的过程。因此,我需要一个新的解决方案,而无需构建模型和Numpy。

  1. https://keras.io/initializers/
  2. https://www.codementor.io/nitinsurya/how-to-re-initialize-keras-model-weights-et41zre2g

1 个答案:

答案 0 :(得分:1)

请参阅先前对问题here的回答。 具体来说,如果您想使用Keras图层的原始权重初始化程序,则可以执行以下操作:

import tensorflow as tf
import keras.backend as K

def init_layer(layer):
    session = K.get_session()
    weights_initializer = tf.variables_initializer(layer.weights)
    session.run(weights_initializer)


layer = model.get_layer('conv2d_1')
init_layer(layer)