重置路缘石层中的重量

2024-05-11 12:48:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

this discussion启发,我尝试以下代码:

# 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())

然而,它只是部分起作用。

部分原因是因为我检查了一些图层,得到了加权值,它们似乎发生了变化。但当我重新开始培训时,成本值远远低于第一次运行时的初始成本值。好像我已经成功地重置了一些重量,但不是全部。

任何关于我错在哪里的建议都会非常感激。谢谢。。


Tags: 数据name模型layernewinputinitvalue
3条回答

通过检查初始化项重置所有层:

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)     

更新:kernel_初始化器现在是kernel.initializer。

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

model.save_weights('model.h5')

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

model.load_weights('model.h5')

这为您提供了一个比较不同数据集的apples-to-apples模型,并且应该比重新编译整个模型更快。

如果要真正地重新随机化权重,而不仅仅是恢复初始权重,可以执行以下操作。根据使用的是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)

相关问题 更多 >