cs231n---卷积网络可视化,deepdream和风格迁移
本课介绍了近年来人们对理解卷积网络这个“黑盒子”所做的一些可视化工作,以及deepdream和风格迁移。
1 卷积网络可视化
1.1 可视化第一层的滤波器
我们把卷积网络的第一层滤波器权重进行可视化(权重值缩放到0~255之间)可以发现:

第一层的滤波器可以看做模版匹配,那么它寻找的模式就是一些边和线。也就是说,当滤波器滑动到边和线的时候,会有较大的激活值。这跟人脑的功能几乎是一致的。
然而,我们只能可视化第一层滤波器得到如此有意义的结论,可视化后面的滤波器,我们将无法看到什么有用的东西。
1.2 研究最后一层
这里的最后一层指的是在输入到最后的得分之前的那一层。
最近邻

左图是我们在像素空间上求最近邻的结果,右图是我们在最后一层产生的特征向量空间上求最近邻的结果。可以看到右边的有些结果,虽然在像素上大有不同,但是却有相同的语义含义。说明卷积网络处理后的特征向量确实包含着语义信息。
t-SNE降维后可视化
还有一种方法是对最后一层产生的特征向量做t-SNE降维(一种非线性降维方法),降到两维。然后在二维坐标系中将这些图片的位置标识出来。具体结果可以看这里:
http://cs.stanford.edu/people/karpathy/cnnembed/
1.3 可视化激活层
有一些研究可视化了中间的激活层(featureMap):

大部分的激活好像都不能看到什么东西,有一个激活很明显的与人脸对应。
1.4 产生最大激活值的图片碎片
我们从每层当中选择一个深度切片,然后在CNN上前向传播大量的图片,观察这些深度切片上的神经元的激活值。对每一张图片来说,选取深度切面上激活值最大的那个神经元,并截取这个神经元所能看到的图片区域。然后按照激活值的大小对这些图片区域进行排序。

上图中,每一行表示每一个深度切面的排序结果,可以看到一个深度切面确实是在寻找一种相同的模式。并且,高层所寻找的是一种更大的图片结构,这是因为高层的神经元具有更大的感受野。
1.5 “排除”实验
有一项研究通过遮挡图像的某一部分,将这部分替换为平均像素值,然后查看对输出分数的影响,绘制热力图。

可以看到船的主体部分,大象的身体,卡丁车以及赛道都对其具体的分类有较大影响。
1.6 Saliency Maps
我们可以查看输出分数关于输入像素的梯度(也就是哪些像素的改变对于输出分数影响最大)。将梯度取绝对值并缩放到0~255之间,进行可视化:

这也被称为Saliency Maps。 Saliency Maps可以用来做无监督的语义分割(注意,这里事实上还是有监督的,因为产生Saliency Maps的肯定是一个训练好的CNN,只不过我们不需要那些对每个像素都打好标签的图片)。这方面内容可以看看这篇文章:Rother et al, “Grabcut: Interactive foreground extraction using iterated graph cuts”, ACM TOG 2004
1.7 guided backprop
与 Saliency Maps类似,只不过我们这里是看某个特定神经元的激活值关于图片像素的梯度。对梯度可视化的结果如下:

上图我们看到的是(4)中的神经元关于对应的输入图片的梯度。显然,每一个神经元的激活都对图像的一种特定模式特别敏感,印证了我们在(4)中的结论。
1.8 Gradient Ascent
Saliency Maps 和guided backprop都是前向传播一张特定的图片,然后看输出分数或中间激活值关于输入像素的梯度。
Gradient Ascent则是要找到使得某个激活值最大的输入是长什么样子,即生成一张图片。我们使用的方法是输入一张空白图片,前向传播得到激活值(或得分值),然后反向传播计算激活(得分)关于输入的梯度,然后输入使用梯度下降更新,不断迭代,直到生成一张满意的图片。

这里我们添加了正则项,是为了使得生成的图片更自然。
这里是一些生成的结果:

另外还有一些方法能够使得生成的图片更漂亮,具体可以看CS231n课件。
我们可以用Gradient Ascent 的方法来生成对抗样本,步骤为:

生成的对抗样本在人眼上看不出什么差别,但在神经网络看来却会将其错误分类。这确实有点颠覆我们的认知。

更多对抗样本的知识见Ian Goodfellow的讲座。
2 DeepDream
deepdream其实就是利用Gradient Ascent来最大化某一层激活的范数,相当于放大这一层学到的特征。具体步骤为:

最后会生成一些很crazy的图片,这里不贴图了。可以看看deepdream的官方博客:
http://googleresearch.blogspot.ch/2015/06/inceptionism-going-deeper-into-neural.html
3 风格迁移
在介绍风格迁移之前,先介绍特征反演和纹理生成。
3.1 特征反演 Feature Inversion
特征反演是为了查看不同层的特征向量能保留多少原始的图片信息。
任选一张图片,前向传播到已经训练好的CNN。然后选取CNN当中某一层产生的特征向量,记住这个向量。现在,我们要生成一张图片,尽量让它在该层产生一样的特征向量。这个任务仍然是用Gradient Ascent来做,目标函数定义为最小化生成图片的特征向量与给定特征向量的L2距离,并且加一些正则化项保证生成图片的平滑:

用这种方法,我们可以看到不同层的特征向量所包含的信息完整度:

可以看到,在relu2_2层,可以根据特征向量几乎无损地恢复出原图片。但是随着层的深入,神经网络记住的只是图片的线条结构,颜色这些低阶信息开始丢失。
3.2 纹理生成 Texture Synthesis
本节主要介绍目前效果最好的基于深度学习的神经纹理生成方法。注意在这之前有一些传统的方法(最近邻法),这些方法在简单纹理上表现效果可以,但无法处理更复杂的纹理生成。
格莱姆矩阵 Gram Matrix
将一张图片传入一个已经训练好的CNN,选定其中一层激活,其大小是C*H*W,可以看做是H x W 个C维向量。从这个激活图中任意选取两个C维向量,做矩阵乘法可以得到一个矩阵。然后对激活图中任意两个C维向量的组合,都可以求出这样一个矩阵。把这些矩阵求和并平均,就是Gram Matrix。

Gram Matrix其实是feature之间的偏心协方差矩阵(即没有减去均值的协方差矩阵)。其计算了每个通道特征之间的相关性,考察哪些特征是此消彼长的,哪些特征是同时出现的。我们认为Gram Matrix度量了图片中的纹理特性,并且不包含图像的结构信息。事实上,使用协方差矩阵代替Gram Matrix也能取得很好的效果,但是Gram Matrix有更高效的计算方法:将激活图张量C*H*W展开成C*HW的形式,然后将其乘以其转置,即得到gram矩阵。
神经纹理生成
当我们有了Gram矩阵这一度量图像纹理特性的神器后,就可以使用类似于Gradient Ascent的算法来产生特定纹理的图像。算法流程为:

该算法旨在生成与目标图像具有相同gram矩阵的图像。这里计算的损失是生成图像与目标图像各层gram矩阵的加权L2距离。
效果

这张图表示,如果以更高层gram矩阵的L2距离作为损失函数,那么生成图像就会更完全地重建图像的空间结构。这是由于更高层的神经元具有更大的感受野导致的。
3.3 风格迁移
如果我们结合特征反演和纹理生成,就可以实现所谓的风格迁移。我们需要两张图像,一张图像称为Content image,生成图像需要重建它的空间结构;另一张图像称为Style image,生成图像需要重建它的纹理结构。使用下面的框架完成这个任务:

在这个框架中,我们同时优化特征反演和纹理生成的损失函数(与gram矩阵的距离以及与激活图的距离的加权和),使得生成图既具有Content image的空间结构,又具有Style image的纹理结构。
这里有一些超参数,使得我们可以控制生成的图像:


此外,我们可以使用不同风格的gram矩阵的加权和,来生成多风格图:

Fast Style Transfer
上面的风格迁移框架,每生成一张新的图像都需要迭代数次。因此有研究提出了下面的Fast style Transfer的框架:

同样使用特征反演和纹理生成的联合损失函数,更新前馈网络中的参数值。这样,训练好一个前馈网络后,每次生成一个新图像只需要进行一次前向传播即可。
cs231n---卷积网络可视化,deepdream和风格迁移的更多相关文章
- 『cs231n』通过代码理解风格迁移
『cs231n』卷积神经网络的可视化应用 文件目录 vgg16.py import os import numpy as np import tensorflow as tf from downloa ...
- Distill详述「可微图像参数化」:神经网络可视化和风格迁移利器!
近日,期刊平台 Distill 发布了谷歌研究人员的一篇文章,介绍一个适用于神经网络可视化和风格迁移的强大工具:可微图像参数化.这篇文章从多个方面介绍了该工具. 图像分类神经网络拥有卓越的图像生成能力 ...
- [DeeplearningAI笔记]卷积神经网络4.6-4.10神经网络风格迁移
4.4特殊应用:人脸识别和神经网络风格转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.6什么是神经网络风格转换neural style transfer 将原图片作为内容图片Cont ...
- 单图像三维重建、2D到3D风格迁移和3D DeepDream
作者:Longway Date:2020-04-25 来源:单图像三维重建.2D到3D风格迁移和3D DeepDream 项目网址:http://hiroharu-kato.com/projects_ ...
- EdgeFormer: 向视觉 Transformer 学习,构建一个比 MobileViT 更好更快的卷积网络
前言 本文主要探究了轻量模型的设计.通过使用 Vision Transformer 的优势来改进卷积网络,从而获得更好的性能. 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结.最新技术跟 ...
- keras图像风格迁移
风格迁移: 在内容上尽量与基准图像保持一致,在风格上尽量与风格图像保持一致. 1. 使用预训练的VGG19网络提取特征 2. 损失函数之一是"内容损失"(content loss) ...
- Keras实现风格迁移
风格迁移 风格迁移算法经历多次定义和更新,现在应用在许多智能手机APP上. 风格迁移在保留目标图片内容的基础上,将图片风格引用在目标图片上. 风格本质上是指在各种空间尺度上图像中的纹理,颜色和视觉图案 ...
- fast neural style transfer图像风格迁移基于tensorflow实现
引自:深度学习实践:使用Tensorflow实现快速风格迁移 一.风格迁移简介 风格迁移(Style Transfer)是深度学习众多应用中非常有趣的一种,如图,我们可以使用这种方法把一张图片的风格“ ...
- ng-深度学习-课程笔记-14: 人脸识别和风格迁移(Week4)
1 什么是人脸识别( what is face recognition ) 在相关文献中经常会提到人脸验证(verification)和人脸识别(recognition). verification就 ...
随机推荐
- 【深入浅出-JVM】(5):Java 虚拟机结构
Java 虚拟机基本结构 Java 堆 新生代.老年代划分 栈帧 感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,您的鼓励是作者写作最大的动力. 作 者 : @mo ...
- 解决webpack打包速度慢的解决办法
技巧1 webpack在打包的时候第一次总是会做很长的准备工作,包括加载插件之类的.在刚接触webpack的时候总是webpack一下-测一下-改一下-再webpack一下,这种方式最后让很多人崩溃了 ...
- ServiceFabric极简文档-5.0 Service Fabric有状态与无状态
Service Fabric 应用程序方案 2017/08/14 作者 Edward Chen Jack Zeng Azure Service Fabric提供了一个可靠而灵活的平台,可用于编写和运行 ...
- 数据库中 ’’ 和 NULL的区别
null不是对象,''是对象 从'',你就可以知道这是一个字符串类型的数据,是一个长度为零的字符串. 从NULL,你只能知道这里没有赋过值,是空的,他不属于任何数据类型. 我们在数据库实际使用中,一般 ...
- Python 爬虫:豆瓣电影Top250,包括电影导演、类型、年份、主演
结果输出到文本文件中. import codecs import requests from bs4 import BeautifulSoup headers={'User-Agent': 'Mozi ...
- 关于python3与python2同时存在情况下导入pyqt失败解决记录
最近感觉tkinter功能还是比较不适合新手做出高大上的界面,故开始使用pyqt,通过pip安装好了之后,利用qt设计师设计好界面之后,cmd运行之,报错提示没有找到pyqt5模块,IDE运行能正常加 ...
- MVC+EFCore 完整教程18 -- 升级分布视图至 View Component
之前我们详细介绍过分布视图(partial view),在有一些更加复杂的场景下,.net core为我们提供了更加强大的组件 view component, 可以认为view component是 ...
- RDB和AOF的区别
redis的持久化方式RDB和AOF的区别 1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据 ...
- Centos7 安装Homestead环境2
历史命令, -- :: cd /etc/yum.repos.d/ -- :: wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtu ...
- jsp数据交互(一).2
01.什么是JSP内置对象(jsp核心)? Java 内置对象 Java 作用域 解析:jsp内置对象是web容器创建的一组对象.我们都知道tomcat这款软件可以看成是一种web容器,所以我们可以 ...