- 作者:韩信子@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/37
- 本文地址:http://www.showmeai.tech/article-detail/274
- 申明:版权所有,转载请分割平台与作者并注明出处
- 珍藏ShowMeAI查看更多精彩内容
本系列为 斯坦福CS231n 《深度学习与计算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频能够在 这里 查看。更多材料获取形式见文末。
前言
深度可视化技术是深度学习中一个仍处于摸索阶段的学术研究热点,它能够帮忙咱们更直观地了解模型做的事件。
以计算机视觉为例,CNN 中有着数以千计的卷积滤波器。深度神经网络中不同的滤波器会从输出图像中提取不同特色示意。
己有的钻研表明低层的卷积核提取了图像的低级语义个性(如边缘、角点),高层的卷积滤波器提取了图像的高层语义个性(如图像类别)。
然而,因为深度神经网络会以逐层复合的形式从输出数据中提取特色,咱们依然无奈像Sobel算子提取的图像边缘后果图一样直观地察看到深度神经网络中的卷积滤波器从输出图像中提取到的特色示意。
本篇内容ShowMeAI和大家来看看对模型的了解,包含CNN 可视化与了解的办法,也蕴含一些乏味的利用如DeepDream、图像神经格调迁徙等。
本篇重点
- 特色/滤波器可视化
- DeepDream
- 图像神经格调迁徙
1.特色可视化
咱们在之前的课程里看到CNN的各种利用,在计算机视觉各项任务中施展很大的作用,但咱们始终把它当做黑盒利用,本节内容咱们先来看看特色可视化,次要针对一些外围问题:
- CNN工作原理是什么样的
- CNN的两头档次都在寻找匹配哪些内容
- 咱们对模型了解和可视化有哪些办法
1.1 第一个卷积层
1) 可视化卷积核
第一个卷积层绝对比较简单,能够把第一层的所有卷积核可视化来形容卷积层在原始图像匹配和关注什么。
可视化卷积核的背地原理是,卷积就是卷积核与图像区域做内积的后果,当图像上的区域和卷积核很类似时,卷积后果就会最大化。咱们对卷积核可视化来察看卷积层在图像上匹配寻找什么。
常见的CNN架构第一层卷积核如下:
从图中能够看到,不同网络的第一层仿佛都在匹配有向边和色彩,这和动物视觉零碎开始局部组织的性能很靠近。
1.2 中间层
第二个卷积层就绝对简单一些,不是很好察看了。
第一个卷积层应用 \(16\) 个 \(7 \times 7 \times 3\) 的卷积核,第二层应用 \(20\) 个 \(7 \times 7 \times 16\) 的卷积核。因为第二层的数据深度变成 \(16\) 维,不能间接可视化。一种解决办法是对每个卷积核画出 \(16\) 个 \(7 \times 7\) 的灰度图,一共画 \(20\) 组。
然而第二层卷积不和图片间接相连,卷积核可视化后并不能间接察看到有清晰物理含意的信息。
1) 可视化激活图
与可视化卷积核相比,将激活图可视化更有察看意义。
比方可视化 AlexNet 的第五个卷积层的 \(128\) 个 \(13 \times 13\) 的特色图,输出一张人脸照片,画出 Conv5 的 \(128\) 个特色灰度图,发现其中有激活图仿佛在寻找人脸(不过大部分都是噪声)。
2) Maximally Activating Patches(最大激活区块)
可视化输出图片中什么类型的小块能够最大水平的激活不同的神经元。
- 比方抉择 AlexNet 的 Conv5 里的第 \(17\) 个激活图(共 \(128\) 个),而后输出很多的图片通过网络,并且记录它们在 Conv5 第 \(17\) 个激活图的值。
- 这个特色图上局部值会被输出图片集最大激活,因为每个神经元的感触野无限,咱们能够画出这些被最大激活的神经元对应在原始输出图片的小块,通过这些小块察看不同的神经元在寻找哪些信息。
如下图所示,每一行都是某个神经元被最大激活对应的图片块,能够看到:
- 有的神经元在寻找相似眼睛的货色
- 有的在寻找蜿蜒的曲线等
如果不应用 Conv5 的激活图,而是更前面的卷积层,因为卷积核视线的扩充,寻找的特色也会更加简单,比方人脸、相机等,对应图中的上面局部。
1.3 倒数第二个全连贯层
1) 最邻近
对于最近邻算法的具体常识也能够参考ShowMeAI的下述文章
- 图解机器学习教程 中的文章详解 **[KNN算法及其利用**](http://www.showmeai.tech/arti…)
- 深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记解读中的文章图像分类与机器学习根底
另一个有价值的察看对象是输出到最初一层用于分类的全连贯层的图片向量,比方 AlexNet 每张图片会失去一个 \(4096\) 维的向量。
应用一些图片来收集这些特征向量,而后在特征向量空间上应用最邻近的办法找出和测试图片最类似的图片。作为比照,是找出在原像素上最靠近的图片。
能够看到,在特征向量空间中,即便原像素差距很大,但却能匹配到理论很类似的图片。
比方大象站在左侧和站在右侧在特色空间是很类似的。
2) 降维
对于PCA降维算法的具体常识也能够参考ShowMeAI的下述文章
- 图解机器学习教程 中的文章详解 降维算法详解
另一个察看的角度是将 \(4096\) 维的向量压缩到二维立体的点,办法有PCA,还有更简单的非线性降维算法比方 t-SNE(t-distributed stochastic neighbors embeddings,t-散布邻域嵌入)。咱们把手写数字 0-9 的图片通过CNN提取特色降到2维画出后,发现都是按数字簇散布的,分成10簇。如下图所示:
同样能够把这个办法用到 AlexNet 的 \(4096\) 维特征向量降维中。
咱们输出一些图片,失去它们的 \(4096\) 维特征向量,而后应用 t-SNE 降到二维,画出这些二维点的网格坐标,而后把这些坐标对应的原始图片放在这个网格里。
如果大家做这个试验,能够察看到类似内容的图片汇集在了一起,比方左下角都是一些花草,右上角汇集了蓝色的天空。
1.4 哪些像素对分类起作用?
1) 遮挡试验(Occlusion Experiments)
有一些办法能够断定原始图片的哪些地位(像素)对最初的后果起作用了,比方遮挡试验(Occlusion Experiments)是一种办法。
它在图片输出网络前,遮挡图片的局部区域,而后察看对预测概率的影响,能够设想失去,如果遮盖住外围局部内容,将会导致预测概率明显降低。
如下图所示,是遮挡大象的不同地位,对「大象」类别预测后果的影响。
2) 显著图(Saliency Map)
除了后面介绍到的遮挡法,咱们还有显著图(Saliency Map)办法,它从另一个角度来解决这个问题。
显著图(Saliency Map)办法是计算分类得分绝对于图像像素的梯度,这将通知咱们在一阶近似意义上对于输出图片的每个像素如果咱们进行小小的扰动,那么相应分类的分值会有多大的变动。
能够在下图看到,基本上找出了小狗的轮廓。
进行语义宰割的时候也能够使用显著图的办法,能够在没有任何标签的状况下能够使用显著图进行语义宰割。
3) 疏导式反向流传
不像显著图那样应用分类得分对图片上的像素求导,而是应用卷积网络某一层的一个特定神经元的值对像素求导,这样就能够察看图像上的像素对特定神经元的影响。
然而这里的反向流传是疏导式的,即 ReLU 函数的反向流传时,只回传大于 \(0\) 的梯度,具体如下图所示。这样的做法有点奇怪,然而成果很好,图像很清晰。
咱们把疏导式反向流传计算的梯度可视化和最大激活块进行比照,发现这两者的体现很类似。
下图右边是最大激活块,每一行代表一个神经元,右侧是该神经元计算失去的对原始像素的疏导式反向流传梯度。
下图的第一行能够看到,最大激活该神经元的图像块都是一些圆形的区域,这表明该神经元可能在寻找蓝色圆形态物体,下图右侧能够看到圆形区域的像素会影响的神经元的值。
4) 梯度回升(Gradient Ascent)
疏导式反向流传会寻找与神经元分割在一起的图像区域,另一种办法是梯度回升,合成一张使神经元最大激活或分类值最大的图片。
咱们在训练神经网络时用梯度降落来使损失最小,当初咱们要修改训练的卷积神经网络的权值,并且在图像的像素上执行梯度回升来合成图像,即最大化某些两头神将元和类的分值来扭转像素值。
梯度回升的具体过程为:输出一张所有像素为0或者高斯分布的初始图片,训练过程中,神经网络的权重放弃不变,计算神经元的值或这个类的分值绝对于像素的梯度,应用梯度回升扭转一些图像的像素使这个分值最大化。
同时,咱们还会用正则项来阻止咱们生成的图像过拟合。
总之,生成图像具备两个属性:
- ① 使最大水平地激活分类得分或神经元的值
- ② 使咱们心愿这个生成的图像看起来是天然的。
正则项强制生成的图像看起来是天然的图像,比方应用 L2 正则来束缚像素,针对分类得分生成的图片如下所示:
也能够应用一些其余办法来优化正则,比方:
- 对生成的图像进行高斯含糊解决
- 去除像素值特地小或梯度值特地小的值
上述办法会使生成的图像更清晰。
也能够针对某个神经元进行梯度回升,层数越高,生成的构造越简单。
增加多模态(multi-faceted)可视化能够提供更好的后果(加上更认真的正则化,核心偏差)。通过优化 FC6 的特色而不是原始像素,会失去更加天然的图像。
一个乏味的试验是「愚弄网络」:
输出一张任意图像,比方大象,给它抉择任意的分类,比方考拉,当初就通过梯度回升扭转原始图像使考拉的得分变得最大,这样网络认为这是考拉当前察看批改后的图像,咱们肉眼去看和原来的大象没什么区别,并没有被扭转成考拉,但网络曾经辨认为考拉(图片在人眼看起来还是大象,然而网络分类曾经把它分成考拉了)。
2.DeepDream
DeepDream是一个乏味的AI利用试验,依然利用梯度回升的原理,不再是通过最大化神经元激活来合成图片,而是间接放大某些层的神经元激活特色。
步骤如下:
- ① 首先抉择一张输出的图像,通过神经网络运行到某一层
- ② 接着进行反向流传并且设置该层的梯度等于激活值,而后反向流传到图像并且不断更新图像。
对于以上步骤的解释:试图放大神经网络在这张图像中检测到的特色,无论那一层上存在什么样的特色,当初咱们设置梯度等于特征值,以使神经网络放大它在图像中所检测到的特色。
下图:输出一张天空的图片,能够把网络中学到的特色在原图像上生成:
代码实现能够参考google官网实现 https://github.com/google/deepdream
3.图像神经格调迁徙
对于图像神经网络格调迁徙的解说也能够参考ShowMeAI的下述文章
- 深度学习教程 | 吴恩达专项课程 · 全套笔记解读 中的文章 CNN利用: 人脸识别和神经格调转换
3.1 特色反演(Feature Inversion)
咱们有一个查看不同层的特征向量能保留多少原始的图片信息的办法,叫做「特色反演」。
具体想法是:任选1张图片,前向流传到曾经训练好的 CNN,选取其在 CNN 某一层产生的特征向量,保留这个向量。咱们心愿生成1张图片,尽量让它在该层产生一样的特征向量。
咱们仍旧应用梯度回升办法来实现,这个工作的指标函数定义为「最小化生成图片的特征向量与给定特征向量的L2间隔」,当然咱们会加一些正则化项保障生成图片的平滑,总体如下图所示:
通过这个办法,咱们能够看到不同层的特征向量所蕴含的信息残缺度,如下图所示:
解释解说:
- 在 relu2_2 层,能够依据特征向量简直无损地复原出原图片;
- 从 ReLU4_3 ReLU5_1 重构图像时,能够看到图像的个别空间结构被保留了下来,仍能够分辨出大象,苹果和香蕉,然而许多低层次的细节并比方纹理、色彩在神经网路的较高层更容易损失。
3.2 纹理生成(Texture Synthesis)
上面咱们聊到的是「纹理生成」,针对这个问题,传统的办法有「近邻法」:依据曾经生成的像素查看以后像素四周的邻域,并在输出图像的图像块中计算近邻,而后从输出图像中复制像素。然而这类办法在面对简单纹理时解决得并不好。
1) 格莱姆矩阵(Gram Matrix)
格莱姆矩阵计算方法:
纹理生成的神经网络做法会波及到格莱姆矩阵(Gram Matrix),咱们来介绍一下它,咱们先看看格莱姆矩阵怎么失去:
① 将一张图片传入一个曾经训练好的 CNN,选定其中一层激活,其大小是 \(C \times H \times W\),能够看做是 \(H \times W\) 个 \(C\) 维向量。
② 从这个激活图中任意选取两个C维向量,做矩阵乘法能够失去一个 \(C \times C\) 的矩阵。而后对激活图中任意两个 \(C\) 维向量的组合,都能够求出这样一个矩阵。把这些矩阵求和并均匀,就失去 Gram Matrix。
格莱姆矩阵含意:
格莱姆矩阵通知咱们两个点代表的不同特色的同现关系,矩阵中地位索引为 \(ij\) 的元素值十分大,这意味着这两个输出向量的地位索引为 \(i\) 和 \(j\) 的元素值十分大。
格莱姆矩阵捕捉了一些二阶统计量,即“映射特色图中的哪些特色偏向于在空间的不同地位一起激活”。
格莱姆矩阵其实是特色之间的偏心协方差矩阵(即没有减去均值的协方差矩阵)。其计算了每个通道特色之间的相关性,体现的是哪些特色此消彼长,哪些特色同时呈现。
咱们能够认为格莱姆矩阵度量了图片中的纹理个性,并且不蕴含图像的构造信息,因为咱们对图像中的每一点所对应的特征向量取平均值,它只是捕捉特色间的二阶同现统计量,这最终是一个很好的纹理描述符。
事实上,应用协方差矩阵代替格莱姆矩阵也能获得很好的成果,然而格莱姆矩阵有更高效的计算方法:
- 将激活图张量 \(C \times H \times W\) 开展成 \(C \times HW\) 的模式,而后将其乘以其转置。
2) 神经纹理生成(Neural Texture Synthesis)
当咱们有了格莱姆矩阵这一度量图像纹理个性的工具后,就能够应用相似于梯度回升算法来产生特定纹理的图像。
算法流程如下图所示:
纹理生成步骤:
- ① 首先把含有纹理的图像输出到一个预训练网络中(例如VGG),记录其每一层的激活图并计算每一层的格莱姆矩阵。
- ② 接着随机初始化一张要生成的新的图像,同样把这张初始化图像通过预训练网络并且计算每一层的 gram 矩阵。
- ③ 而后计算输出图像纹理矩阵和生成图像纹理矩阵之间的加权 L2 损失,进行反向流传,并计算绝对于生成图像的像素的梯度。
- ④ 最初依据梯度回升一点点更新图像的像素,一直反复这个过程,即计算两个格莱姆矩阵的 L2 范数损失和反向流传图像梯度,最终会生成与纹理图像相匹配的纹理图像。
生成的纹理成果如下图所示:
上图阐明,如果以更高层格莱姆矩阵的 L2 间隔作为损失函数,那么生成图像就会更好地重建图像的纹理构造(这是因为更高层的神经元具备更大的感触野)。
3.3 图像神经格调迁徙(Style Transfer)
如果咱们联合特色反演和纹理生成,能够实现十分热门的一个网络应用「图像神经格调迁徙(Style Transfer)」。它能依据指定的1张内容图片和1张格调图片,合并生成具备类似内容和格调的合成图。
具体的做法是:筹备两张图像,一张图像称为内容图像,须要疏导咱们生成图像的主题;另一张图像称为格调图像,生成图像须要重建它的纹理构造。而后独特做特色辨认,最小化内容图像的特色重构损失,以及格调图像的格莱姆矩阵损失。
应用上面的框架实现这个工作:
上图所示的框架中,应用随机噪声初始化生成图像,同时优化特色反演和纹理生成的损失函数(生成图像与内容图像激活特征向量的 L2 间隔以及与格调图像 gram 矩阵的 L2 间隔的加权和),计算图像上的像素梯度,反复这些步骤,利用梯度回升对生成图像调整。
迭代实现后咱们会失去格调迁徙后的图像:它既有内容图像的空间结构,又有格调图像的纹理构造。
因为网络总损失是「特色反演」和「纹理生成」的两局部损失的加权和,咱们调整损失中两者的权重能够失去不同偏向的输入,如下图所示:
也能够扭转格调图像的尺寸:
咱们甚至能够应用不同格调的格莱姆矩阵的加权和,来生成多格调图:
代码实现能够参考这里:https://github.com/jcjohnson/neural-style
3.4 疾速图像格调迁徙(Fast style Transfer)
下面的格调迁徙框架,每生成一张新的图像都须要迭代数次,计算量十分大。因而有钻研提出了上面的 Fast style Transfer 的框架:
疾速图像格调迁徙办法,会在一开始训练好想要迁徙的格调,失去一个能够输出内容图像的网络,间接前向运算,最终输入格调迁徙后的后果。
训练前馈神经网络的办法是在训练期间计算雷同内容图像和格调图像的损失,而后应用雷同梯度来更新前馈神经网络的权重,一旦训练实现,只需在训练好的网络上进行一次前向流传。
代码实现能够参考这里:https://github.com/jcjohnson/fast-neural-style
4.拓展学习
能够点击 B站 查看视频的【双语字幕】版本
- 【课程学习指南】斯坦福CS231n | 深度学习与计算机视觉
- 【字幕+材料下载】斯坦福CS231n | 深度学习与计算机视觉 (2017·全16讲)
- 【CS231n进阶课】密歇根EECS498 | 深度学习与计算机视觉
- 【深度学习教程】吴恩达专项课程 · 全套笔记解读
- 【Stanford官网】CS231n: Deep Learning for Computer Vision
5.参考资料
- CNN可视化/可解释性
- 万字长文概览深度学习的可解释性钻研
6.要点总结
-
了解CNN:
- 激活值:在激活值的根底上了解这些神经元在寻找什么特色,办法有最邻近、降维、最大化图像块、遮挡;
- 梯度:应用梯度回升合成新图像来了解特色的意义,比方显著图、类可视化、愚弄图像、特色反演。
- 格调迁徙:特色反演+纹理生成。
ShowMeAI 斯坦福 CS231n 全套解读
- 深度学习与计算机视觉教程(1) | CV引言与根底 @CS231n
- 深度学习与计算机视觉教程(2) | 图像分类与机器学习根底 @CS231n
- 深度学习与计算机视觉教程(3) | 损失函数与最优化 @CS231n
- 深度学习与计算机视觉教程(4) | 神经网络与反向流传 @CS231n
- 深度学习与计算机视觉教程(5) | 卷积神经网络 @CS231n
- 深度学习与计算机视觉教程(6) | 神经网络训练技巧 (上) @CS231n
- 深度学习与计算机视觉教程(7) | 神经网络训练技巧 (下) @CS231n
- 深度学习与计算机视觉教程(8) | 常见深度学习框架介绍 @CS231n
- 深度学习与计算机视觉教程(9) | 典型CNN架构 (Alexnet, VGG, Googlenet, Restnet等) @CS231n
- 深度学习与计算机视觉教程(10) | 轻量化CNN架构 (SqueezeNet, ShuffleNet, MobileNet等) @CS231n
- 深度学习与计算机视觉教程(11) | 循环神经网络及视觉利用 @CS231n
- 深度学习与计算机视觉教程(12) | 指标检测 (两阶段, R-CNN系列) @CS231n
- 深度学习与计算机视觉教程(13) | 指标检测 (SSD, YOLO系列) @CS231n
- 深度学习与计算机视觉教程(14) | 图像宰割 (FCN, SegNet, U-Net, PSPNet, DeepLab, RefineNet) @CS231n
- 深度学习与计算机视觉教程(15) | 视觉模型可视化与可解释性 @CS231n
- 深度学习与计算机视觉教程(16) | 生成模型 (PixelRNN, PixelCNN, VAE, GAN) @CS231n
- 深度学习与计算机视觉教程(17) | 深度强化学习 (马尔可夫决策过程, Q-Learning, DQN) @CS231n
- 深度学习与计算机视觉教程(18) | 深度强化学习 (梯度策略, Actor-Critic, DDPG, A3C) @CS231n
ShowMeAI 系列教程举荐
- 大厂技术实现:举荐与广告计算解决方案
- 大厂技术实现:计算机视觉解决方案
- 大厂技术实现:自然语言解决行业解决方案
- 图解Python编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解AI数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程
- 图解机器学习算法:从入门到精通系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程:吴恩达专项课程 · 全套笔记解读
- 自然语言解决教程:斯坦福CS224n课程 · 课程带学与全套笔记解读
- 深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记解读
发表回复