深度学习之Deep Dream算法

2015年,Google公开了一个魔性的算法——Deep Dream,此算法可以生成下面的图片

如何做到的呢?

首先,在卷积神经网络(简称CNN)的研究中,大家并不满足于精准的图片分类,还想知道网络中各层乃至各个神经元都学习到了什么东西。如果能将每一个神经元的内容可视化出来,将是十分有用的。

那么如何对CNN中的某一神经元进行可视化呢?

Deep Dream的想法就是:学习出一张图片,使得这一神经元能够产生最大激活。从数值上看,就是使得这一神经元的输出值最大。

更一般的,不仅可以最大化某一个神经元的输出,还可以最大化一组神经元的输出,或者某一层的总输出。这样得到的是多个神经元的混合可视化结果。

因此,Deep Dream是基于训练好的卷积神经网络进行图片的生成,在生成图片时,神经网络是冻结的,也就是网络的权重不再更新,只更新输入图片。

常用的预训练卷积网络包括Google的Inception、VGG网络和ResNet网络等。

Deep Dream的流程为:

取得输入图片,可以是随机噪声,也可以是真实的照片

将图片输入网络,得到所希望可视化的神经元的输出值

计算神经元输出值对图片各像素的梯度

使用梯度下降更新图片

重复第2、3、4步,直到满足所设定的条件

可以看出,实际上就是一个梯度下降算法。但是,朴素的实现通常得不到质量很好的图片,就像下图,此处可视化的是一个对花朵产生最大激活的神经元。

这并不是梯度下降的问题,实际上,上图输入网络,可以得到花朵神经元的较大激活。之所以这种图片看起来质量不高,是因为它包含了过多的噪音(至少对人类来说是噪音)。与此类似的还有:

一些图片看起来是白噪声,而神经网络却可以将其识别为猫或狗。

将原始照片添加上一些人眼不可分辨的噪声,就可以骗过神经网络,使其分类错误

那么如何提高所产生的图片质量呢?就是使用正则化方法

一张图片里包含了高频和低频的信息,日常的照片所包含的都是低频的,因此,将高频信息过滤掉可以得到更好的结果。

但还可以更好。方法是在学习的时候对梯度进行处理,将梯度中所包含的高频成分降低,低频成分提高。

另一种方法是对输入图片进行缩放,先输入缩小后的图片,迭代若干步后,放大一点,再迭代,再放大,依次进行,直到满足所设定的条件。与放大后的图片相比,小图片相当于是低频,逐级学习使得后面的学习过程具有一个较好的初值。

下面是这种方法生成的图片的一个例子(可视化的是“狗”神经元)

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180123A021ME00?refer=cp_1026

扫码关注云+社区