重置 Keras 模型的所有权重

Posted

技术标签:

【中文标题】重置 Keras 模型的所有权重【英文标题】:Reset all weights of Keras model 【发布时间】:2020-12-05 16:39:31 【问题描述】:

我希望能够重置整个 Keras 模型的权重,这样我就不必再次编译它。编译模型目前是我代码的主要瓶颈。这是我的意思的一个例子:

import tensorflow as tf  

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(16, activation='relu'),
    tf.keras.layers.Dense(10)
])

model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.001),
                loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=['accuracy'])
   
data = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = data.load_data()

model.fit(x=x_train, y=y_train, epochs=10)

# Reset all weights of model here
# model.reset_all_weights() <----- something like that

model.fit(x=x_train, y=y_train, epochs=10)

【问题讨论】:

也许这可以帮助Reset weights in Keras layer“在编译模型之后但在训练之前保存初始权重......然后在训练之后,通过重新加载初始权重来'重置'模型”。 【参考方案1】:

你可以使用这个循环:

for ix, layer in enumerate(model.layers):
    if hasattr(model.layers[ix], 'kernel_initializer') and \
            hasattr(model.layers[ix], 'bias_initializer'):
        weight_initializer = model.layers[ix].kernel_initializer
        bias_initializer = model.layers[ix].bias_initializer

        old_weights, old_biases = model.layers[ix].get_weights()

        model.layers[ix].set_weights([
            weight_initializer(shape=old_weights.shape),
            bias_initializer(shape=len(old_biases))])

原始重量:

model.layers[1].get_weights()[0][0]
array([ 0.4450057 , -0.13564804,  0.35884023,  0.41411972,  0.24866664,
        0.07641453,  0.45726687, -0.04410008,  0.33194816, -0.1965386 ,
       -0.38438258, -0.13263905, -0.23807487,  0.40130925, -0.07339832,
        0.20535922], dtype=float32)

新权重:

model.layers[1].get_weights()[0][0]
array([-0.4607593 , -0.13104361, -0.0372932 , -0.34242013,  0.12066692,
       -0.39146423,  0.3247317 ,  0.2635846 , -0.10496247, -0.40134245,
        0.19276887,  0.2652442 , -0.18802321, -0.18488845,  0.0826562 ,
       -0.23322225], dtype=float32)

【讨论】:

感谢分享这个解决方案!您能估计一下这种方法何时会比重新编译整个模型更快吗? 我不知道。为什么在你的情况下这是一个问题?根据我的经验,编译只需要几分之一秒 当你必须编译模型一百万次时,它开始成为一个问题:)【参考方案2】:

我在 tensorflow 2 中编写了一个重新初始化权重的函数。

def reinitialize(model):
    for l in model.layers:
        if hasattr(l,"kernel_initializer"):
            l.kernel.assign(l.kernel_initializer(tf.shape(l.kernel)))
        if hasattr(l,"bias_initializer"):
            l.bias.assign(l.bias_initializer(tf.shape(l.bias)))
        if hasattr(l,"recurrent_initializer"):
            l.recurrent_kernel.assign(l.recurrent_initializer(tf.shape(l.recurrent_kernel)))

我花了比应该想出这个的时间更长的时间,而且我尝试了许多在我的特定用例中失败的事情。 IMO 这应该是标准的 TF 功能。

【讨论】:

以上是关于重置 Keras 模型的所有权重的主要内容,如果未能解决你的问题,请参考以下文章

model.compile() 是不是初始化 Keras(tensorflow 后端)中的所有权重和偏差?

加载权重 keras LSTM 不工作

Keras如何改变加载模型的可训练层

如何在Keras中进行举重训练

如何正确提取 Keras ConvNet 权重矩阵以在 Excel 中使用?

使用Keras训练神经网络备忘录