重置Keras层中的权重

Tor*_*Tor 24 python keras keras-layer

我想重置(随机化)我的Keras(深度学习)模型中所有层的权重.原因是我希望能够使用不同的数据拆分对模型进行多次训练,而不必每次都进行(慢)模型重新编译.

受此讨论的启发,我正在尝试以下代码:

# Reset weights
for layer in KModel.layers:
    if hasattr(layer,'init'):
        input_dim = layer.input_shape[1]
        new_weights = layer.init((input_dim, layer.output_dim),name='{}_W'.format(layer.name))
        layer.trainable_weights[0].set_value(new_weights.get_value())
Run Code Online (Sandbox Code Playgroud)

但是,它只是部分有效.

部分地,因为我已经检查了一些layer.get_weights()值,它们似乎发生了变化.但是当我重新开始培训时,成本值远低于第一次运行时的初始成本值.这几乎就像我成功重置了一些重量,但不是全部重量.

任何关于我出错的提示都将深表感谢.谢谢..

ezc*_*chx 28

在编译模型之后但在训练之前保存初始权重:

model.save_weights('model.h5')
Run Code Online (Sandbox Code Playgroud)

然后在训练之后,通过重新加载初始权重来"重置"模型:

model.load_weights('model.h5')
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个苹果到苹果模型来比较不同的数据集,并且应该比重新编译整个模型更快.

  • 我最终做了类似的事情.保存到磁盘并加载需要花费很多时间,所以我只是将权重保存在变量中:weights = model.get_weights()在运行第一次训练之前,我得到这样的初始权重.然后,在每次后续训练之前,我重新加载初始权重并运行jkleint的shuffle方法,如我发布的链接中所述.似乎工作顺利.. (6认同)
  • 对于@Tor建议的完整代码片段:`weights = model.get_weights()`,`model.compile(args)`,`model.fit(args)`,`model.set_weights(weights)` (2认同)

Bal*_*Ben 11

如果您想真正重新随机化权重,而不仅仅是恢复初始权重,您可以执行以下操作.根据您使用的是TensorFlow还是Theano,代码略有不同.

from keras.initializers import glorot_uniform  # Or your initializer of choice
import keras.backend as K

initial_weights = model.get_weights()

backend_name = K.backend()
if backend_name == 'tensorflow': 
    k_eval = lambda placeholder: placeholder.eval(session=K.get_session())
elif backend_name == 'theano': 
    k_eval = lambda placeholder: placeholder.eval()
else: 
    raise ValueError("Unsupported backend")

new_weights = [k_eval(glorot_uniform()(w.shape)) for w in initial_weights]

model.set_weights(new_weights)
Run Code Online (Sandbox Code Playgroud)


Men*_*rel 11

通过检查初始值设定项重置所有图层:

def reset_weights(model):
    import keras.backend as K
    session = K.get_session()
    for layer in model.layers: 
        if hasattr(layer, 'kernel_initializer'): 
            layer.kernel.initializer.run(session=session)
        if hasattr(layer, 'bias_initializer'):
            layer.bias.initializer.run(session=session)     
Run Code Online (Sandbox Code Playgroud)

  • 落伍了吗?现在`kernel_initializer`没有属性`run`。在我的情况下,`kernel_initializer`是一个VarianceScaling对象 (4认同)
  • 我认为这是最好的方法。 (2认同)

小智 8

我找到了clone_model创建具有相同架构但新模型权重的克隆网络的函数。

使用示例:

model_cloned = tensorflow.keras.models.clone_model(model_base)
Run Code Online (Sandbox Code Playgroud)

权重对比:

original_weights = model_base.get_weights()
print("Original weights", original_weights)
print("========================================================")
print("========================================================")
print("========================================================")
model_cloned = tensorflow.keras.models.clone_model(model_base)
new_weights = model_cloned.get_weights()
print("New weights", new_weights)
Run Code Online (Sandbox Code Playgroud)

如果多次执行此代码,您会注意到克隆模型每次都会收到新的权重。


Nic*_*ais 7

张量流2答案:

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=old_biases.shape)])
Run Code Online (Sandbox Code Playgroud)

原始重量:

model.layers[1].get_weights()[0][0]
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

新权重:

model.layers[1].get_weights()[0][0]
Run Code Online (Sandbox Code Playgroud)
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)

Run Code Online (Sandbox Code Playgroud)