本课介绍了近年来人们对理解卷积网络这个“黑盒子”所做的一些可视化工作,以及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和风格迁移的更多相关文章

  1. 『cs231n』通过代码理解风格迁移

    『cs231n』卷积神经网络的可视化应用 文件目录 vgg16.py import os import numpy as np import tensorflow as tf from downloa ...

  2. Distill详述「可微图像参数化」:神经网络可视化和风格迁移利器!

    近日,期刊平台 Distill 发布了谷歌研究人员的一篇文章,介绍一个适用于神经网络可视化和风格迁移的强大工具:可微图像参数化.这篇文章从多个方面介绍了该工具. 图像分类神经网络拥有卓越的图像生成能力 ...

  3. [DeeplearningAI笔记]卷积神经网络4.6-4.10神经网络风格迁移

    4.4特殊应用:人脸识别和神经网络风格转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.6什么是神经网络风格转换neural style transfer 将原图片作为内容图片Cont ...

  4. 单图像三维重建、2D到3D风格迁移和3D DeepDream

    作者:Longway Date:2020-04-25 来源:单图像三维重建.2D到3D风格迁移和3D DeepDream 项目网址:http://hiroharu-kato.com/projects_ ...

  5. EdgeFormer: 向视觉 Transformer 学习,构建一个比 MobileViT 更好更快的卷积网络

    ​  前言 本文主要探究了轻量模型的设计.通过使用 Vision Transformer 的优势来改进卷积网络,从而获得更好的性能. 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结.最新技术跟 ...

  6. keras图像风格迁移

    风格迁移: 在内容上尽量与基准图像保持一致,在风格上尽量与风格图像保持一致. 1. 使用预训练的VGG19网络提取特征 2. 损失函数之一是"内容损失"(content loss) ...

  7. Keras实现风格迁移

    风格迁移 风格迁移算法经历多次定义和更新,现在应用在许多智能手机APP上. 风格迁移在保留目标图片内容的基础上,将图片风格引用在目标图片上. 风格本质上是指在各种空间尺度上图像中的纹理,颜色和视觉图案 ...

  8. fast neural style transfer图像风格迁移基于tensorflow实现

    引自:深度学习实践:使用Tensorflow实现快速风格迁移 一.风格迁移简介 风格迁移(Style Transfer)是深度学习众多应用中非常有趣的一种,如图,我们可以使用这种方法把一张图片的风格“ ...

  9. ng-深度学习-课程笔记-14: 人脸识别和风格迁移(Week4)

    1 什么是人脸识别( what is face recognition ) 在相关文献中经常会提到人脸验证(verification)和人脸识别(recognition). verification就 ...

随机推荐

  1. 关于在记事本写入"\n"不显示换行的原因

    Linux系统下直接使用  "\n"  即可换行 windows下需要使用   "\r\n"

  2. ~~核心编程(二):面向对象——类&属性~~

    进击のpython 类&属性 虽然我们上一part写了一个面向对象的程序:人狗大战 但是如果在面向对象来看 你这些的就不够规范 你既然选择用面向对象的思想来写 那你就要符合人家的定义规范和操作 ...

  3. MyBatis从入门到精通:各个实体类

    SysUser类: package tk.mybatis.simple.model; import java.util.Date; public class SysUser { public Long ...

  4. [原创]wireshark&xterm安装、配置和使用

    --wireshark && xterm--一.安装wireshark: #apt-get install wireshark二.启动wireshark: #wireshark 或者 ...

  5. Day1 -Python program

    采用python 3.5 用PyCharm编译 第一串代码 print ("hello,world!") 练习1 输入一个用户名和密码,如果输入正确,就欢迎登陆,否则就显示错误. ...

  6. Git常用操作指南

    目录 前言 Git简介 安装之后第一步 创建版本库 本地仓库 远程仓库 版本控制 工作区和暂存区 版本回退 撤销修改 删除文件 分支管理 创建与合并分支 解决冲突 分支管理策略 状态存储 多人协作 R ...

  7. Excel催化剂开源第5波-任务窗格在OFFICE2013中新建文档不能同步显示问题解决

    在OFFICE2013及之后,使用了单文档界面技术,不同于以往版本可以共享任务空格.功能区.所以当开发任务窗格时,需要考虑到每一个工作薄都关联一个任务窗格. 背景介绍 单文档界面摘录官方定义如下:对 ...

  8. C语言入门9-2-模块大致一览

    字母数字 判断字符是否为英文字母isalpha()判断字符是否为数字isdigit()判断字符是否为英文字母或数字isalnum()判断字符是否为小写字母islower()判断字符是否为大写字母isu ...

  9. Java 基础知识面试题

    equals与==有什么区别? (1)==是判断两个变量或实例是不是指向同一个内存空间 (2)equals是判断两个变量或实例所指向的内存空间的值是不是相同 Object有哪些公用方法? (1)equ ...

  10. centOS7启动apache,报错Caused by: java.net.UnknownHostException: wshCentOS:

    测试方法: ping 127.0.0.1 ping localhost 解决方案: vi /etc/hosts 把127.0.0.1和wshCentOS绑定就好 按 i 进入修改模式,按 esc 退出 ...