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

Cod*_*die 5 python keras tensorflow

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

Ove*_*gon 5

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

更新:我还建议查看 RNN以了解权重、梯度和激活可视化。


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

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

解释权重:有几种方法:

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

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

然而,最终的决定因素将是验证性能——而且它也是更实用的。它是这样的:

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

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


建议:还可视化层输出- 请参阅底部的此答案和示例输出。


视觉示例

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Conv1D 输出可视化:(来源