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

为Keras卷积神经网络(CNN)的每一层激活层添加可视化

嘿,我来帮你搞定CNN层激活可视化的事儿!你已经有了一个Sequential结构的卷积神经网络,要探查每一层激活层的输出其实很 straightforward,咱们一步步来实现:

1. 创建能输出中间层激活的模型

首先,我们需要基于你现有的模型,构建一个新模型——它的输入和原模型一致,但输出是所有激活层的结果。Keras的Model类正好能帮我们做到这一点。

假设你的原模型是通过get_model()获取的,先加载它:

from tensorflow.keras.models import Model

# 加载你的原模型
model = get_model()

接下来,筛选出所有激活层(比如你用的LeakyReLU)的输出张量:

# 提取所有LeakyReLU激活层的输出
activation_outputs = [layer.output for layer in model.layers if isinstance(layer, LeakyReLU)]

# 如果想查看所有层(包括卷积、池化层)的输出,直接改成下面这行:
# activation_outputs = [layer.output for layer in model.layers]

然后用这些输出张量创建新的激活可视化模型:

activation_model = Model(inputs=model.input, outputs=activation_outputs)
2. 获取测试图像的激活输出

现在需要准备一张测试图像,按照模型输入的要求做预处理(比如尺寸、归一化、通道数)。举个例子:

from tensorflow.keras.preprocessing.image import load_img, img_to_array
import numpy as np

# 加载并预处理测试图像
img_path = "your_test_image.jpg"
# 调整尺寸到模型要求的img_rows和img_cols,通道数匹配IMG_MODE
img = load_img(img_path, target_size=(img_rows, img_cols), color_mode="grayscale" if IMG_MODE == 1 else "rgb")
img_array = img_to_array(img)
# 增加batch维度(模型输入需要批量维度)
img_array = np.expand_dims(img_array, axis=0)
# 和训练时的预处理一致,比如归一化到0-1区间
img_array /= 255.0

然后用activation_model预测,得到所有激活层的输出:

# 获取激活值,返回的是一个列表,每个元素对应一个激活层的输出张量
activations = activation_model.predict(img_array)
3. 可视化激活特征图

最后一步就是把这些激活值画出来。我们写一个简单的可视化函数,把每个特征图都展示在网格里:

import matplotlib.pyplot as plt

def plot_activations(activation, layer_name):
    # 调整张量形状到(height, width, num_filters),适配不同的通道格式
    if activation.shape[1] == IMG_MODE:  # 处理channels_first格式
        activation = np.transpose(activation[0], (1, 2, 0))
    else:
        activation = activation[0]
    
    num_filters = activation.shape[-1]
    # 设置网格列数,平衡布局美观度
    cols = 8
    rows = num_filters // cols + (1 if num_filters % cols != 0 else 0)
    
    plt.figure(figsize=(cols * 2, rows * 2))
    plt.suptitle(f"Activation Maps: {layer_name}", fontsize=16)
    
    for i in range(num_filters):
        plt.subplot(rows, cols, i + 1)
        # 可选不同配色方案,比如"gray"适合灰度特征,"viridis"是彩色渐变
        plt.imshow(activation[:, :, i], cmap="viridis")
        plt.axis("off")  # 关闭坐标轴让特征图更清晰
    plt.tight_layout()
    plt.show()

# 遍历所有激活层的输出,逐一可视化
for idx, activation in enumerate(activations):
    # 获取对应的层名称
    layer_name = activation_outputs[idx].name
    plot_activations(activation, layer_name)
一些实用小提示
  • 如果你想查看特定层的输出,比如某一个卷积层,可以直接指定层的索引,比如activation_outputs = [model.layers[2].output](对应你模型里的第一个LeakyReLU层)
  • 不同的colormap会影响可视化效果,比如cmap="gray"适合灰度特征图,cmap="plasma"是暖色调的彩色图
  • 如果特征图数量特别多,可以调整cols的数值(比如改成16),让布局更紧凑
  • 一定要保证测试图像的预处理和训练时完全一致,不然得到的激活值可能没有参考意义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:28:15