实际的问题是为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。
答案 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)