cs231n 2023春季课程理解——lecture_12

引言

在上篇文章cs231n 2023春季课程理解——lecture_11中,我们了解了深度学习中的另外两个任务——图像分割以及目标检测。在这篇文章中,将要了解视觉模型的可视化,即了解模型学习了什么等。

特征可视化

在之前,我们学习了如何搭建CNN网络,如何将其应用到各个领域。但我们只是将其当作是一个黑盒应用(就是知道它这么干能行,但是内部原理是什么我们都不清楚)。例如,我们都知道CNN可以学习到图像的特征(正是因为学习到了特征,才能对图像进行分割、分类和检测),但是它是如何学习到的特征呢,怎么查找这些特征呢?下面将通过第一层卷积层,中间的卷积层以及最后的全连接层的可视化来介绍。
在这里插入图片描述

第一层卷积层

对于上面的问题, 我们首先从第一层卷积层可视化来了解一下。对于第一层,我们可以将卷积核可视化来观看第一层卷积层对于原始图像来说会关注一些什么特征。可视化卷积核的原理是:卷积的实质其实是卷积核与图像做内积,当图像上的区域与卷积核很相似时,卷积结果就会最大化。所以,我们可以通过可视化卷积核来观察卷积层在图像上匹配和寻找了一些什么特征。常见的一些网络结构的第一层卷积核如下:从图中可以看到,尽管网络模型不同,但他们好像在第一层卷积层的时候都在匹配一些边缘以及图像的颜色
在这里插入图片描述

中间层卷积层

相比于第一层,中间层通过可视化卷积核会比较困难,这是因为一般来说第一层的卷积核都是 B × 3 × H × W B\times 3\times H\times W B×3×H×W,也就是深度(图像通道数)一般为3,而在第二层及以后,其深度会增加(如下图),此时就不好直接进行可视化操作了。此时有一个迂回的方法,就是对这些卷积核独立画,比如说,对于第二层的卷积核,总共画20组,每组16个7×7的灰度图;第三组则每组20个。但是这样的话,它不与图片直接相连,所以即便可视化之后,也不能直接观察到有清晰物理含义的信息。
在这里插入图片描述

全连接层

对于卷积神经网络,在分类任务中,一般都是通过全连接层来确定每个类别的分数,而在倒数第二层的全连接层中,一般有一个4096维度的特征向量(比如说AlexNet),然后再将它们送到最后一层全连接层中得到每个类别的可能得分数。所以另一种途径去了解CNN的可视化是了解在CNN的最后一层发生了什么。因此我们能做的就是获取一些数据集,然后通过CNN训练每个图像的4096维向量,然后试图找到并可视化最后一个隐藏层而不是第一层卷积层。
在这里插入图片描述
所以你能想象到的是去尝试最近邻方法,如下图所示,通过对比测试图像与使用k最近邻方法后的向量空间中最相似的几个类别,并最终得出一个类别。
在这里插入图片描述
这里还有另外一个角度去尝试可视化最后一层,那就是使用降维的思想,也就是说将4096维的向量压缩到一个二维平面。降维的方法有PCA、t-SNE等。例如,将手写数字的图片经过CNN提取特征之后使用t-SNE降到2维画出,发现所有的数字都是按簇分布(如下图所示)
在这里插入图片描述
同样地,我们也可以将其应用在全连接层上(例如AlexNet网络模型)。在将一些图片输入模型,并对得到的4096维向量使用t-SNE降维之后,画出对应的网格坐标,并将对应的原始图片放入其中,能发现内容相似的图片都聚集在了一起,左下角的一些花草图片。
在这里插入图片描述

激活图(activations map)可视化

与可视化卷积核相比,可视化激活图(我觉得其实应该是特征图)其实更有意义。比如说AlexNet的第五个卷积层的特征图,它的形状大小为128×13×13。如下图所示,画出这一层特征图的128个特征灰度图,我们能发现,其中有部分灰度图显示正在寻找人脸(虽然看起来这128个大部分都是噪声)。
在这里插入图片描述

Maximally Activating Patches(最大激活块)

另一种比较有效的可视化中间特征的方法是可视化输入图像中的特定类型的块在不同功能的神经元中引起的最大激活。为此,这里选取了AlexNet的第五层卷积层,并记录每次输入图像之后在这层中给的输出特征图,并选取一个通道(也许是第17个通道)。其结果如下图右上部分,我们可以看到,不同的神经元在寻找的特征也不一样,比如有一些在找眼睛部位,有些在找线条(当然如果感受野更大的话,寻找的范围也就更大,比如说人脸,相机等,详情见下图右下部分)。
在这里插入图片描述

对分类起作用的像素

上面了解了如何进行可视化操作,现在来了解图像中,哪些具体的像素对分类的结果起作用。一些常用的方法有遮挡法、显著图(Saliency Map)法、(引导式)反向传播法以及梯度上升法。

遮挡法(Occlusion)

遮挡法指的是在将图片输入到网络中之前,使用一些mask将图片的某些区域遮挡,以此来观察不同遮挡对最终概率的影响。如下图所示,如果将图像中关键地方给遮挡住,最终的分类结果的影响还是挺大的。
在这里插入图片描述

显著图(Saliency Map)法

显著图(Saliency Map)法从另一个角度来显示哪些像素起了作用。它利用了反向传播的原理,即通过类得分(非标准化)相对于图像像素的梯度,这样的话我们能知道在一阶近似意义上,对于输入图片的每个像素,如果我们进行小小的扰动,那么相应分类的分值会有多大的变化。
在这里插入图片描述
在这里插入图片描述

(引导式)反向传播法((guided) backprop)

与显著法类似,也是通过反向传播来确定对图像中不同像素在分类中的作用。但与显著法使用分类得分对图片上的像素进行求导不同的事,它使用CNN中某一层卷积层的一个特定神经元的值来对像素进行求导。这样就可以观察图像上的像素对特定神经元的影响。注意,这里的反向传播是引导式的,即ReLU函数的反向传播时,只回传大于0的梯度(没怎么明白,但视频里面说它的效果好像挺不错)。
在这里插入图片描述
将最大及活块的可视化与引导式反向传播法的可视化进行对比,我们能发现这两者的表现非常相似,如下图。下图的第二行我们可以看到,最大激活块中,第二行的神经元主要都是在在寻找人脸部位,而在引导式反向传播中,则是人脸区域内的像素会影响神经元的值。
在这里插入图片描述

梯度上升法(Gradient Ascent)

与之前的方法不同的是,梯度上升法会合成一张使神经元最大激活或者分类值最大的图片。在训练神经网络时,我们会使用梯度下降来使得模型训练的损失最小,现在既然需要修正训练的卷积神经网络的权值,并且在图像的像素上使用梯度上升来合成图像,即最大化某些中间神将元和类的分值来改变像素值。梯度上升的具体过程为:

  1. 输入一张全黑或者符合高斯分布的初始图片。
  2. 前向计算这张图片的当前分类得分。
  3. 反向计算神经元的值或这个类的得分相对于像素的梯度。
  4. 使用梯度上升改变一些图像的像素使这个分值最大化(即更新图像)。
  5. 重复2-4.
    同时,为了防止过拟合,在梯度上升时也可以使用正则项(比如L2)来抑制。
    在这里插入图片描述
    在这里插入图片描述
    当然,除了L2,还可以使用一些其他的方法来进行优化正则,如进行高斯模糊处理或者将像素值或者梯度值特别小的地方赋值为0
    在这里插入图片描述

风格迁移

特征反转

特征反转可以查看不同层的特征向量能保留多少原始的图片信息,它的思想为:给定一张图片在CNN上的一个特征向量a,生成一个新的图片,使得这张图片能尽可能的满足它也具有相同的特征向量a,同时看起来应该很自然。这个过程的实现主要通过最小化生成图片的特征向量与给定的特征向量L2距离(当然也添加了一些正则化来确保图像平滑),具体如下图。
在这里插入图片描述
在这里插入图片描述
如上图所示,通过这个方法我们可以看到不同层的特征向量所包含的信息的完整度。例如在relu2_2中,信息与原图几乎没有区别,而在深层的特征向量中,如relu5_1、relu5_3,一般的空间结构杯保留,仍然能够区分出物体的轮廓,但具体的纹理,颜色等则缺失严重。

纹理合成

在介绍纹理合成前,先考虑一个问题:给定一个小的纹理图片,我们该怎么生成更大的含有一样的纹理的图片?对于这个问题,其实可以通过最近邻算法来实现,即根据已知像素查看当前像素周围的领域,并在输入图像的图像块中计算近邻,然后从输入图像中复制对应像素(如下图)。虽然这种方法能生成更大的含有与输入相同纹理的图片,但是只在纹理比较简单的时候效果比较好,如果纹理比较复杂时,效果则比较差。
在这里插入图片描述

格莱姆矩阵(Gram Matrix)

纹理合成的神经网络方法有些会涉及到格莱姆矩阵,它用于度量各个维度自己的特性以及各个维度之间的关系。它的本质是特征之间的偏心协方差矩阵(没有减去均值的协方差矩阵)。它计算了每个通道特征之间的相关性,体现的是哪些特征此消彼长,哪些特征同时出现。现在我们先了解它是怎么生成的:
6. CNN的每层都会生成一个 C × H × W C\times H\times W C×H×W的特征图,可以将其看做 H × W H\times W H×W个C维向量
7. 从这个特征图中任意选取两个C维向量,通过矩阵乘法可以生成一个 C × C C\times C C×C的矩阵。
8. 重复步骤2直至所有向量都使用完,然后结束时对生成的矩阵求平均,就得到了格莱姆矩阵。
当然,它有个更高效的计算方法,那就是将特征图( C × H × W C\times H\times W C×H×W)展开成 C × H W C\times HW C×HW的形式,然后再乘以它的转置。

神经纹理生成

知道了格莱姆矩阵之后,就可以使用神经网络来产生特定纹理的图像,其具体流程如下:

  1. 在ImageNet上先预训练一个CNN(比如说VGG-19)
  2. 将带有纹理的图片放入CNN中训练,记录每一层的特征图
  3. 计算每一层特征图的格莱姆矩阵
  4. 从随机噪声中初始化一张图片
  5. 将生成的图片输送到网络并计算每层的格莱姆矩阵
  6. 计算输入图像以及生成图像之间的加权L2损失
  7. 进行反向传播,并计算图像的梯度
  8. 根据梯度上升更新图像
  9. 重复步骤5

在这里插入图片描述
其生成的图像如下,可以看到,当网络层次越深时,生成的图像就越贴近原图的纹理,这是因为更高的神经元感受野更大。
在这里插入图片描述

风格迁移

当将特征反转以及纹理合成相结合,就成了风格迁移,即根据一张内容图片以及一张风格图片,合并生成一张具有类似风格和内容的合成图。
在这里插入图片描述
在这里插入图片描述

快速风格迁移

上面讲的风格迁移需要大量的计算(大量的计算前向传播和反向传播),这导致速度非常慢。一个好的解决办法是:训练另外一个网络来执行风格迁移,如下图所示。
在这里插入图片描述

总结

在这一讲中,主要介绍了对CNN的可视化以及了解图像中的哪些像素对分类起作用,其实就是通过可视化来了解CNN在训练过程中的作用,在各个层中会去寻找哪些特征。此外,介绍了风格迁移,即确定一种风格,如何将其他风格的图像上的内容转移到这种风格上。

本文所有图片均来自于cs231公开课的网站之中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值