神经网络的中间层

25 年 6 月 23 日 星期一
915 字
5 分钟

又开新坑了,随便吧,反正我也不一定会填

可视化

torchshow

分析特征图是我们做图像处理的非常关键的一部分,但是我们所遇到的中间层特征的size[B,C,H,W],大部分不能用简单的

python
import torchshow as ts
ts.show(rgb_map)
ts.show(depth_map)

这些单通道和三通道的特征图可以直接可视化,但是多通道的呢!尤其是中间层到C=128的要如何可视化呢

通道选择

选择第一个通道进行可视化

python
def visualize_single_channel(feature_map, channel_index):
    # 选择第一张图像(batch 中的第一个元素)
    image = feature_map[0]  # 选择batch中的第一张图像

    # 可视化单个通道
    plt.imshow(image[channel_index].cpu().numpy(), cmap='viridis')
    plt.axis('off')
    plt.title(f'Channel {channel_index}')
    plt.show()

选择前/后num_classes个通道进行可视化

python
def visualize_multiple_channels_pre(feature_map, num_channels=8):
    # 选择第一张图像(batch 中的第一个元素)
    image = feature_map[0]

    # 可视化多个通道(并排显示)
    fig, axs = plt.subplots(1, num_channels, figsize=(20, 5))
    for i in range(num_channels):
        axs[i].imshow(image[i].cpu().numpy(), cmap='viridis')
        axs[i].axis('off')
        axs[i].set_title(f'Channel {i}')
    plt.show()

def visualize_multiple_channels_back(feature_map, num_channels=8):
    # 选择第一张图像(batch 中的第一个元素)
    image = feature_map[0]
    _,C,_,_ = feature_map.shape
    # 可视化多个通道(并排显示)
    fig, axs = plt.subplots(1, num_channels, figsize=(20, 5))
    for i in range(C-1 ,C-num_channels-1,-1):
        axs[i].imshow(image[i].cpu().numpy(), cmap='viridis')
        axs[i].axis('off')
        axs[i].set_title(f'Channel {i}')
    plt.show()

选择前/后num_classes个通道进行PCA到三通道进行可视化

python
def pca_visualization_pre(feature_map, num_channels=8):
    # 选择第一张图像(batch 中的第一个元素)
    image = feature_map[0].cpu().numpy()  # 转换为numpy数组

    # 选择前num_channels个通道进行PCA降维
    selected_channels = image[:num_channels]  # 取前num_channels个通道
    selected_channels = selected_channels.reshape(num_channels, -1).T  # 重塑为 [H*W, C] 形状

    # 使用PCA将多个通道降维为3个主成分
    pca = PCA(n_components=3)
    pca_result = pca.fit_transform(selected_channels)

    # 将PCA结果重构成图像
    pca_result = pca_result.reshape(feature_map.shape[2], feature_map.shape[3], 3)  # 重构为 HxWx3
    plt.imshow(pca_result)
    plt.axis('off')
    plt.title('PCA Visualization of Activation Map')
    plt.show()

def pca_visualization_back(feature_map, num_channels=8):
    # 选择第一张图像(batch 中的第一个元素)
    image = feature_map[0].cpu().numpy()  # 转换为numpy数组

    # 选择前num_channels个通道进行PCA降维
    selected_channels = image[:-num_channels]  # 取前num_channels个通道
    selected_channels = selected_channels.reshape(num_channels, -1).T  # 重塑为 [H*W, C] 形状

    # 使用PCA将多个通道降维为3个主成分
    pca = PCA(n_components=3)
    pca_result = pca.fit_transform(selected_channels)

    # 将PCA结果重构成图像
    pca_result = pca_result.reshape(feature_map.shape[2], feature_map.shape[3], 3)  # 重构为 HxWx3
    plt.imshow(pca_result)
    plt.axis('off')
    plt.title('PCA Visualization of Activation Map')
    plt.show()

理论

浅层的特征图一般前几个通道,可以反应图像的基本局部信息,观察边缘,纹理等局部特征

中层的特征图也是取前几个通道,更在意结构,形状等特征

  • 观察前几层的 特征图,你通常会看到边缘、线条和小的局部模式。

  • 可视化这些特征图时,留意图像中 响应强烈的区域,通常这些区域对应输入图像中的边缘、角落和其他显著的局部特征。

深层的特征图就会开始在意高级语义特征了,一般取后几个通道进行可视化

随着网络深入,特征图会逐渐变得更加 抽象,并开始捕捉图像中的高级语义特征(例如物体、部分结构等)。

  • 物体识别: 在深层特征图中,网络会开始检测和组合更多的信息,以识别物体的形状、颜色等特征。
  • 图像部分: 网络还可能识别图像的不同部分(例如,识别人脸的眼睛、鼻子,或者猫的耳朵等)。

激活图

激活图一般是relu等非线性激活函数的输出图,可以得到网络对某些图像区域的反应强度,简单可视化的话方法和上面是一样的,类似grad-cam因为我不是很需要所以我不会这里也不会展开介绍

就这样吧

文章标题:神经网络的中间层

文章作者:io-wy

文章链接:https://io-wy.github.io/posts/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E4%B9%8B%E4%B8%AD%E9%97%B4%E5%B1%82[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。