CS231N Lecture14 可视化与理解
Lecture14 Visualizing &Understand
可视化模型&帮助理解
Visualizing what models have learned
Visualizing filters 可视化过滤器
对第一层过滤器使用有效,对更高层多通道图像作用不大

对更高层:将其切割为灰度图像,但效果不明显。

Visualizing final layer features 可视化最后一层的特征
Near neighbor 最近邻

Dimensionality Reduction 降维
常见方法:PCA(主成分分析:线性降维)、t-SNE(非线性降维算法)(降低维度的同时,尽量保持原有结构)

Visualizing Activations 可视化激活操作
将图像的n个切片(每个切片对于一个conv层)可视化为灰度图像
Understanding input pixels
Maximally Activating Patches 最大激活补丁
方法步骤
选择层和通道:
在 CNN 中,选择一个特定的层(例如,conv5)和一个特定的通道(例如,第 17 个通道)。每一层的输出通常是一个三维张量,包含多个通道,每个通道对应不同的特征检测器。
输入图像并记录激活值:
将大量图像输入到网络中,并记录所选通道的激活值。对于每张图像,网络会在该通道上生成一个激活图(activation map),表示该通道在不同空间位置上的响应强度。
识别最大化激活的 patches:
对于每个图像,找到激活图中值最高的位置。这些位置对应于输入图像中导致该通道最大激活的 patches。
提取这些 patches 并可视化它们。这些 patches 通常代表了该通道所检测的特定特征。

找到关键像素:通过遮挡寻找(不常用)
使用掩码遮挡图像、移动掩码位置,观察预测概率值的变化。可以画出“显著图”saliency map。
(可以用于判断是否在看正确的图像部分,而不是“作弊”,但计算成本很高)

找到关键像素:通过反向传播寻找(常用)Saliency via backprop
计算(非标准化)class score相对于图像像素的梯度,取绝对值和RGB通道上的最大值

显著图:发现偏见
如图,偏见为用背景有无雪来区分wolf/dog

通过反向传播理解中间特征
通过反向传播,找到哪个像素,对中间神经元影响最大。
guided backprop
将负的上游梯度和负的区域梯度都归零。这样操作得到的输出图更好看。
能让我们找出影响神经元值的像素。


使用梯度上升来可视化特征 Gradient ascent
原理
生成一个图片,让生成的图片能够最大激活神经元。
其中,f(I)是神经元的值,R(I)是一个图像正则器,让生成的图片看上去更自然。I*是生成的图片。

具体方法
- 初始化图片全为0。将图片前向运行通过网络,得到神经元的值。
- 再反向传播,找到使神经元值改变的图像像素
- 在图片上对其进行小的更新
- 多次重复以上三步(与生成对抗性样本相似

正则化
为了让图片更自然、而不是生成对抗性样本,正则化很重要。
正则化方法:
L2 norm(简单)

更好的正则方法:周期性优化
优化手段如下:
(1)高斯模糊图像
(2)将小梯度像素剪辑为0
(3)将小梯度像素剪辑为0

在FC6进行优化
在FC6进行优化,由于FC6是高层特征表示,能够生成更真实的图片。

Style transfer
Feature Inversion 特征反演
- 给定一张输入图像,通过CNN前向传播,提取某一层的特征表示向量
- 从提取的特征表示出发,通过优化方法(如梯度下降)重建一张新的图像,使得这张新图像通过CNN前向传播后,能够生成与原始特征表示尽可能接近的特征。(从而帮助理解哪些特征被CNN表示/抛弃)
- loss函数(此处):给定图像特征表示与生成图像特征表示在L2范数上是否接近

DeepDream
尝试放大网络中某一层的神经元激活(放大图像特征),而不是生成图像。
选择一张图和CNN的某一层:重复以下操作:
- 向前传递,计算选定层数的激活(提取特征)
- 将所选层的梯度设置为与其激活相等
- 反向传播,计算图像上的梯度
- 更新图像
相当于最大化L2范数。

代码:https://github.com/google/deepdream

运行结果:
用于较低层:(倾向于寻找边缘)

用于较高层:(出现一些奇幻的形状)

Texture synthesis 纹理合成
Gram Matrix –利用CNN捕获局部纹理信息、丢弃空间信息
选择某一层的输出张量C x H x W,将其看成H x W的网格,划分C维的向量
对两个C维向量外积,得到一个C x C矩阵。
对所有HW 对向量求平均,得到Gram Matrix
帮助我们理解:哪些特征在输入图像中相互关联(倾向于一起激活/共同发生)

使用梯度上升,配合Gram matrix算法
步骤:
- 在imagenet上预训练CNN模型
- 通过CNN向前运行输入纹理,记录每一层的激活情况;对每一层计算了形状为Ci × Hi × Wi的特征图
- 在每一层计算Gram矩阵,给出特征的外积(公式如图)
- 利用随机噪声,初始化生成图像
- 将生成的图像通过CNN传递,计算每一层的Gram矩阵
- 计算loss:Gram矩阵间距离的加权和(一般是比较欧几里得距离,并计算标量损失)
- 反向传播,得到生成图像上的梯度
- 依据梯度对生成图像进行改变
- GOTO step 5

运行结果:(从更高层重建纹理,从输入纹理中恢复更大的特征)

Neural style transfer 神经风格迁移
纹理生成+特征提取,将一个图片的纹理风格与另一个图片的空间特征合并,得到新的图片。
code:https://github.com/jcjohnson/neural-style

原理:
从content image提取特征向量,从style image提取gram matrix,将两者结合,使用梯度上升来对生成的图像修改。

可以通过调整比例来修改:1.调整loss权重(更多偏向style/content)2.在运行之前调整style图像的大小可以转移不同类型的特征
- Title: CS231N Lecture14 可视化与理解
- Author: Rongying Liu
- Created at : 2025-02-27 15:44:43
- Updated at : 2025-02-27 16:38:30
- Link: https://github.com/Roinnnn11/Roinnnn11.github.io/2025/02/27/CS231N/14 可视化与理解/
- License: This work is licensed under CC BY-NC-SA 4.0.
