如何比较不同 Keras 模型的权重?

2023-11-24

我已经以 .h5 格式保存了许多模型。我想比较他们的特征,例如重量。 我不知道如何以表格和数字的形式适当地比较它们。 提前致谢。


体重内省是一项相当高级的工作,需要针对特定​​模型的处理。可视化权重在很大程度上是一项技术挑战,但如何处理这些信息则是另一回事 - 我将主要讨论前者,但会涉及后者。

Update: 我也推荐See RNN用于权重、梯度和激活可视化。


可视化权重:一种方法如下:

  1. 检索感兴趣层的权重。Ex: model.layers[1].get_weights()
  2. 了解权重角色和维度。Ex:LSTM 有三组权重:kernel, recurrent, and bias,每个都有不同的目的。Within每个权重矩阵是gate权重 - 输入、单元格、忘记、输出。对于 Conv 层,区别在于过滤器 (dim0)、内核和步幅之间。
  3. 根据 (2) 以有意义的方式组织权重矩阵以进行可视化。Ex:对于 Conv 来说,与 LSTM 不同,特定特征的处理并不是真正必要的,我们可以简单地展平核权重和偏差权重,并在直方图中将它们可视化
  4. 选择可视化方法:直方图、热图、散点图等 - 对于扁平化数据,直方图是最佳选择

解释重量: 一些方法是:

  • Sparsity:如果权重范数(“平均”)较低,则模型是稀疏的。可能有好处,也可能没有好处。
  • Health:如果太多权重为零或接近于零,则表明有太多死亡神经元;这对于调试很有用,因为一旦某个层处于这种状态,它通常不会恢复 - 因此应该重新开始训练
  • 稳定:如果权重变化很大且很快,或者有很多高值权重,则可能表明梯度性能受损,可以通过例如梯度裁剪或权重约束

型号对比:没有一种方法可以简单地并排查看来自不同模型的两个权重并决定“这是更好的一个”;分别分析每个模型,例如如上所述,然后决定哪个模型的优点大于缺点。

然而,最终的决胜局将是验证性能- 而且这也是更实用的一种。它是这样的:

  1. 训练多个超参数配置的模型
  2. 选择具有最佳验证性能的一个
  3. 微调该模型(例如通过进一步的超参数配置)

权重可视化应该主要作为一种调试或记录工具 - 简而言之,即使我们目前对神经网络有最好的理解,也无法仅通过查看权重来判断模型的泛化效果如何。


建议:也可视化层outputs - see 这个答案和底部的示例输出。


视觉示例:

from tensorflow.keras.layers import Input, Conv2D, Dense, Flatten
from tensorflow.keras.models import Model

ipt = Input(shape=(16, 16, 16))
x   = Conv2D(12, 8, 1)(ipt)
x   = Flatten()(x)
out = Dense(16)(x)

model = Model(ipt, out)
model.compile('adam', 'mse')

X = np.random.randn(10, 16, 16, 16)  # toy data
Y = np.random.randn(10, 16)  # toy labels
for _ in range(10):
    model.train_on_batch(X, Y)

def get_weights_print_stats(layer):
    W = layer.get_weights()
    print(len(W))
    for w in W:
        print(w.shape)
    return W

def hist_weights(weights, bins=500):
    for weight in weights:
        plt.hist(np.ndarray.flatten(weight), bins=bins)

W = get_weights_print_stats(model.layers[1])
# 2
# (8, 8, 16, 12)
# (12,)

hist_weights(W)

enter image description here


Conv1D 输出可视化: (source)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何比较不同 Keras 模型的权重? 的相关文章

随机推荐