You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何可视化Keras模型已训练权重并查看异常权重值?

查看Keras模型可训练权重的异常值(TensorFlow后端)

嘿,我来帮你搞定这个查看权重值、统计异常值的问题!基于你用的是TensorFlow后端的Keras,运行在Docker的Jupyter Notebook里,我给你整理了一步步的实现方法:

步骤1:获取权重的数值数组

model.trainable_weights返回的是TensorFlow的变量对象,我们需要把它转换成numpy数组才能查看具体数值。这里兼容TensorFlow 1.x和2.x版本:

import numpy as np
import keras.backend as K

# 遍历所有可训练权重
for weight in model.trainable_weights:
    # 获取权重的名称,方便对应到具体层
    weight_name = weight.name
    # 转换为numpy数组(TF2.x用numpy(),TF1.x用eval())
    if hasattr(weight, 'numpy'):
        weight_values = weight.numpy()
    else:
        # TF1.x需要会话来求值
        weight_values = weight.eval(session=K.get_session())
    
    print(f"\n=== 当前权重: {weight_name} ===")
    print(f"权重形状: {weight_values.shape}")

步骤2:统计0、1、无穷大等异常值

接下来我们可以写一个简单的函数,统计每个权重里的异常值数量和占比,这样能快速看出有没有大量异常值块:

def count_weight_abnormalities(arr):
    """统计数组中的0、1、无穷大、负无穷大、NaN的数量和占比"""
    total_elements = arr.size
    counts = {
        '零值数量': np.sum(arr == 0),
        '壹值数量': np.sum(arr == 1),
        '正无穷数量': np.sum(np.isinf(arr)),
        '负无穷数量': np.sum(np.isneginf(arr)),
        'NaN数量': np.sum(np.isnan(arr))
    }
    # 计算占比
    for key in counts.copy():
        counts[f"{key}(占比)"] = f"{(counts[key] / total_elements) * 100:.2f}%"
    return counts

# 把统计整合到遍历里
for weight in model.trainable_weights:
    weight_name = weight.name
    if hasattr(weight, 'numpy'):
        weight_values = weight.numpy()
    else:
        weight_values = weight.eval(session=K.get_session())
    
    print(f"\n=== 权重: {weight_name} ===")
    print(f"形状: {weight_values.shape}")
    
    # 打印统计信息
    stats = count_weight_abnormalities(weight_values)
    print("异常值统计:")
    for desc, value in stats.items():
        print(f"  {desc}: {value}")
    
    # 可选:打印权重的基础统计信息(均值、标准差等),辅助判断
    print("\n基础统计:")
    print(f"  均值: {np.mean(weight_values):.4f}")
    print(f"  标准差: {np.std(weight_values):.4f}")
    print(f"  最小值: {np.min(weight_values):.4f}")
    print(f"  最大值: {np.max(weight_values):.4f}")

额外小技巧

如果某个权重的形状特别大(比如卷积层的kernel),你可以直接查看部分数值来确认是否有异常块,比如:

# 查看conv2d_1的kernel前3x3的部分
conv1_kernel = [w for w in model.trainable_weights if 'conv2d_1/kernel' in w.name][0].numpy()
print("conv2d_1 kernel的前3x3切片:")
print(conv1_kernel[:3, :3, :, :])

这样你就能清晰地看到每个可训练权重的具体数值,以及是否存在大量0、1或其他异常值啦!

内容的提问来源于stack exchange,提问作者grabbag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:32:15