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

Posted

技术标签:

【中文标题】如何在 Keras 中重新初始化现有模型的层权重?【英文标题】:How to re-initialize layer weights of an existing model in Keras? 【发布时间】:2019-10-30 23:31:35 【问题描述】:

实际的问题是在 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 的新解决方案。

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

【问题讨论】:

【参考方案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)

【讨论】:

遇到错误:*** AttributeError: 'GlorotUniform' object has no attribute 'run' 你是对的,这个语法不再被支持。在我的答案中查看我更新的代码。

以上是关于如何在 Keras 中重新初始化现有模型的层权重?的主要内容,如果未能解决你的问题,请参考以下文章

keras 模型中的平均权重

在 Keras 层中重置权重

如何找出概率输出中每列的哪个类对应于使用Keras进行多类分类?

如何在 Keras 模型中检查每个 epoc 后的权重

Keras网络层之“关于Keras的层(Layer)”

如何保存 Keras 回归模型?