本课介绍了近年来人们对理解卷积网络这个“黑盒子”所做的一些可视化工作,以及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. C语言学习书籍推荐《明解C语言》下载

    柴田望洋 (作者), 管杰 (译者), 罗勇 (译者) <明解C语言>是日本的C语言经典教材,自出版以来不断重印.修订,被誉为“C语言圣经”.作者在日本IT界家喻户晓,出版过一系列极富影响 ...

  2. pdfminer获取整页文本

    #! python2 # coding: utf-8 import sys from cStringIO import StringIO from pdfminer import pdfinterp ...

  3. css单位中px和em,rem的区别

    css单位中分为相对长度单位.绝对长度单位. 今天我们主要讲解rem.em.px这些常用单位的区别和用法. px(绝对长度单位) 相信对于前端来说px这个单位是大家并不陌生,px这个单位,兼容性可以说 ...

  4. ~~核心编程(四):面向对象——单继承&复写~~

    进击のpython 继承 继承的出现!就是一个作用! 为了节省代码! 为什么说节省代码? 你爸爸要是王健林 你是不是就不用愁怎么获得钱了? 为啥? 是不是钱已经有了! 直接拿来用就行了! 我们想一下奥 ...

  5. 重新认识 async/await 语法糖

    提起.Net中的 async/await,相信很多.neter 第一反应都会是异步编程,其本质是语法糖,但继续追查下去,既然是语法糖,那么经过编译之后,真正的代码是什么样的,如何执行的?带着这些疑问, ...

  6. c++课程设计:行政区划管理系统

    大一的课程设计基本上除了计算器,就是各种管理系统.(大概吧) 感觉看到题目整个一年的c++好像没学明白似的.基础知识掌握还算可以,真刀真枪的打代码,而且是实现这么些功能,做成一个管理系统,就真正感觉到 ...

  7. 七、SQL 高级语法一

    Case when Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE ...

  8. linux初学者-DDNS配置篇

    linux初学者-DDNS配置篇 如果DNS服务器要记录多台主机的IP,且这些主机的IP都是通过DHCPD服务自动获取的,那么将会造成很大的困难,因为在DNS设置时无法得知主机具体的IP.如果DHCP ...

  9. zookeeper集群搭建及常用场景实现

    本文完整源码地址 基于zookeeper的常用用法.分布式锁.分布式队列及leader选举实现 https://github.com/killianxu/zookeeper_example zooke ...

  10. cookbook_元编程

    1给函数添加一个包装 问题:给函数加一个外包装层,已添加额外的处理,例如,记录日志,计时统计等 解决方案:可以定义一个装饰器来包装函数 2编写装饰器时如何保存函数的元数据 问题:当一个函数被装饰器装饰 ...