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)
这为您提供了一个苹果到苹果模型来比较不同的数据集,并且应该比重新编译整个模型更快.
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)
小智 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)
如果多次执行此代码,您会注意到克隆模型每次都会收到新的权重。
张量流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)
| 归档时间: |
|
| 查看次数: |
22361 次 |
| 最近记录: |