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

如何在Keras中确定CNN的输入特征重要性?

在Keras CNN中分析行特征重要性的可行方案

当然可行!在你搭建的Keras CNN里,完全可以找出哪些行(特征维度)对分类任务更关键,下面给你几个实用的实现思路:

1. 基于梯度的特征重要性(Grad-CAM变种)

这个方法的核心是通过计算模型预测结果对输入行特征的梯度,来衡量每行的贡献度——梯度绝对值越大,说明该行对预测结果的影响越强。

实现步骤:

  • 用Keras的GradientTape记录输入和模型输出的梯度
  • 计算每个行特征的平均梯度值,作为重要性得分
import tensorflow as tf
from tensorflow.keras.models import load_model

# 假设你的模型已经训练好,输入形状是(None, num_rows, num_features_per_row)
# 如果你的输入是(None, num_features_per_row, num_rows),记得转置适配
model = load_model('your_cnn_model.h5')
num_rows = model.input_shape[1]

# 定义获取梯度的函数
def get_row_importance(input_data):
    input_tensor = tf.convert_to_tensor(input_data, dtype=tf.float32)
    with tf.GradientTape() as tape:
        tape.watch(input_tensor)
        predictions = model(input_tensor)
        # 取预测概率最高的类别对应的输出
        top_class = tf.argmax(predictions[0])
        loss = predictions[:, top_class]
    
    # 计算梯度:(batch_size, num_rows, features) -> 对输入的梯度
    grads = tape.gradient(loss, input_tensor)
    # 对每个行的梯度取绝对值后求平均,得到每行的重要性
    row_importance = tf.reduce_mean(tf.abs(grads), axis=(0, 2)).numpy()
    return row_importance

# 用一个样本测试
sample_input = your_test_data[0:1]  # shape (1, num_rows, features)
importance_scores = get_row_importance(sample_input)
# 按重要性排序
sorted_rows = sorted(range(num_rows), key=lambda i: importance_scores[i], reverse=True)
print("行特征重要性排序(从高到低):", sorted_rows)

2. 特征消融法(Feature Ablation)

这个方法更直观:逐个掩盖某一行的特征(比如把该行所有值置为0),然后观察模型分类准确率的下降幅度——下降越多,说明这一行的特征越重要。

实现步骤:

  • 遍历每一行,生成“消融”后的输入数据
  • 用验证集评估模型在消融后的准确率,对比原始准确率
import numpy as np

# 先获取原始验证集准确率
original_acc = model.evaluate(val_x, val_y, verbose=0)[1]
row_importance = []

for row_idx in range(num_rows):
    # 复制验证集数据,避免修改原数据
    ablated_val_x = val_x.copy()
    # 掩盖第row_idx行的特征
    ablated_val_x[:, row_idx, :] = 0.0
    # 评估消融后的准确率
    ablated_acc = model.evaluate(ablated_val_x, val_y, verbose=0)[1]
    # 计算准确率下降值,作为重要性得分
    importance_score = original_acc - ablated_acc
    row_importance.append(importance_score)
    print(f"行{row_idx}的重要性得分:{importance_score:.4f}")

# 排序结果
sorted_rows = sorted(range(num_rows), key=lambda i: row_importance[i], reverse=True)

3. 卷积层权重分析(针对第一层卷积)

如果你的CNN用了1D卷积(因为每行是独立特征,Conv1D会更适配),可以直接分析第一层卷积核的权重:每个输入通道(对应你的行特征)的权重绝对值之和越大,说明该行越受卷积层关注。

实现代码:

# 获取第一层卷积层的权重
first_conv_layer = model.layers[0]
# 权重形状:(kernel_size, input_channels, output_channels)
weights = first_conv_layer.get_weights()[0]
# 计算每个输入通道(行)的权重绝对值之和
row_importance = np.sum(np.abs(weights), axis=(0, 2))
# 排序
sorted_rows = sorted(range(num_rows), key=lambda i: row_importance[i], reverse=True)

注意事项

  • 如果你的输入矩阵需要转置才能适配CNN(比如原本每行是特征,但CNN期望列是特征),记得在处理前先调整维度,确保行特征对应到模型的输入通道维度。
  • 不同方法的结果可能略有差异,建议结合多种方法交叉验证,比如把梯度法和消融法的结果取平均,得到更可靠的重要性排序。
  • 如果用的是2D CNN,只需要调整梯度计算和消融时的维度索引即可,核心逻辑是一致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:52:58