【深度之眼cs231n第七期】笔记(二十八)

deepdream

实现deepdream主要是为了好玩,它也能帮助我们理解CNN在寻找些什么。
实现步骤:

  1. 选择CNN中的一层;
  2. 通过前向传播,计算选中层的特征;
  3. 令梯度=特征(等同于最大化特征的2范数);
  4. 通过反向传播,计算每个像素的梯度;
  5. 更新梯度(梯度上升);
  6. 跳到步骤2;

【深度之眼cs231n第七期】笔记(二十八)
这里有几个小技巧:

  1. 在前向传播之前抖动图片,在梯度更新后反抖动图片,这是一种正则化手段,可以使图像更平滑;
  2. 在梯度上升时,对梯度进行L1归一化,使生成图像更平滑;
  3. 规定像素的上下界,同样是为了得到更平滑的图像。

【深度之眼cs231n第七期】笔记(二十八)
这样,从一张天空的图片开始,就会得到非常有趣的图片:
有很多经常出现的物种得到了人们的命名,而且这些物种里有很多狗也表明了神经网络的数据情况(在ImageNet上训练的,1000个类别中,有200多个类别都是狗)
【深度之眼cs231n第七期】笔记(二十八)
如果选取神经网络中较浅的层,就会得到类似边缘的东西:
【深度之眼cs231n第七期】笔记(二十八)
运行的时间长一些,并且进行多尺度处理,就会得到一些非常奇葩的图片(的确挺像梦的……):
【深度之眼cs231n第七期】笔记(二十八)
在另一个数据集(MIT places,200个场景类别)上运行deepdream后,得到的图像就比较好看了:
【深度之眼cs231n第七期】笔记(二十八)

特征反演

  1. 给定一张图片,计算它关于神经网络某一层的特征;
  2. 从随机噪声开始,通过梯度上升生成一张图像,希望生成图像和原始图像关于神经网络特定层的特征相似
  3. 正则化用的是全变差正则化,它可以使生成图片更加平滑

【深度之眼cs231n第七期】笔记(二十八)
通过对不同层进行特征反演,我们发现神经网络的浅层中保留更多细节信息,能够很好的还原原始图像;而深层的神经网络特征只保留了语义信息,不能很好的还原原始图像。
【深度之眼cs231n第七期】笔记(二十八)

合成纹理

合成纹理就是给定一张小的纹理图片,希望生成一张大的纹理图片。
在神经网络之前,有很多方法可以做到(比如:最近邻法),不过对于比较复杂的纹理,合成的结果并不美好。
【深度之眼cs231n第七期】笔记(二十八)
2015年的时候,有一篇使用神经网络来合成纹理的文章。为了在神经网络上合成纹理,该文章使用了格拉姆矩阵
计算格拉姆矩阵:

  1. 一张纹理图片,选定神经网络中的特定层;
  2. 通过前向传播计算特定层的特征,大小为CxHxW;
  3. 令F=HxW,则特征大小为CxF;
  4. 计算格拉姆矩阵,[email protected]
    【深度之眼cs231n第七期】笔记(二十八)
    纹理合成的过程类似于特征反演,只不过特征反演希望两张图片的特征相似,而纹理合成是希望两张图片的格拉姆矩阵相似
    这是一些纹理合成的结果,深层的格拉姆矩阵能得到更好的结果。
    【深度之眼cs231n第七期】笔记(二十八)

风格迁移

把特征反演和纹理合成结合起来就是风格迁移:
【深度之眼cs231n第七期】笔记(二十八)
生成的图片保留了一张输入图片的内容,学到了另一张图片的风格:
所以风格迁移的损失总共有三部分:内容损失(生成图片和内容图片关于某一层的特征差异)、风格损失(生成图片和内容图片关于多层的格拉姆矩阵差异之和)和全变差正则化
【深度之眼cs231n第七期】笔记(二十八)
通过控制内容损失和风格损失的权重,可以生成不同的图片:
【深度之眼cs231n第七期】笔记(二十八)
通过更改风格图像的大小,最后生成的图像也有所不同:
【深度之眼cs231n第七期】笔记(二十八)
风格迁移加上多尺度处理,可以生成4k的风格迁移图片:
【深度之眼cs231n第七期】笔记(二十八)
但是风格迁移有一个缺点,就是要耗费大量的资源(每生成一张图片都要经过多次前向和反向传播)。
所以一种更有效的方法是,为每一种风格训练一个网络(使用预训练的CNN模型),训练好之后,只用输入内容图像就能生成风格迁移的图像。
【深度之眼cs231n第七期】笔记(二十八)
另一篇文章使用了实例归一化(pytorch里有这个函数),而不是一般的批量归一化,因为风格不同的图片不能使用批量归一化。
【深度之眼cs231n第七期】笔记(二十八)
但是保存多个风格的神经网络也比较麻烦,Google提出了一个神经网络,它能生成不同风格图形(实时的)
【深度之眼cs231n第七期】笔记(二十八)

小结

学习了很多理解CNN的方法

  1. 特征:最后一层特征的KNN有更好的结果、最后一层特征降维后能够得到C类、最大化特征块、遮挡图像
  2. 梯度:显著图、类可视化、fooling image、特征反演
  3. 好玩:deepdream、风格迁移

【深度之眼cs231n第七期】笔记(二十八)