2015年,Google公开了一个魔性的算法——Deep Dream,此算法可以生成下面的图片
如何做到的呢?
首先,在卷积神经网络(简称CNN)的研究中,大家并不满足于精准的图片分类,还想知道网络中各层乃至各个神经元都学习到了什么东西。如果能将每一个神经元的内容可视化出来,将是十分有用的。
那么如何对CNN中的某一神经元进行可视化呢?
Deep Dream的想法就是:学习出一张图片,使得这一神经元能够产生最大激活。从数值上看,就是使得这一神经元的输出值最大。
更一般的,不仅可以最大化某一个神经元的输出,还可以最大化一组神经元的输出,或者某一层的总输出。这样得到的是多个神经元的混合可视化结果。
因此,Deep Dream是基于训练好的卷积神经网络进行图片的生成,在生成图片时,神经网络是冻结的,也就是网络的权重不再更新,只更新输入图片。
常用的预训练卷积网络包括Google的Inception、VGG网络和ResNet网络等。
Deep Dream的流程为:
取得输入图片,可以是随机噪声,也可以是真实的照片
将图片输入网络,得到所希望可视化的神经元的输出值
计算神经元输出值对图片各像素的梯度
使用梯度下降更新图片
重复第2、3、4步,直到满足所设定的条件
可以看出,实际上就是一个梯度下降算法。但是,朴素的实现通常得不到质量很好的图片,就像下图,此处可视化的是一个对花朵产生最大激活的神经元。
这并不是梯度下降的问题,实际上,上图输入网络,可以得到花朵神经元的较大激活。之所以这种图片看起来质量不高,是因为它包含了过多的噪音(至少对人类来说是噪音)。与此类似的还有:
一些图片看起来是白噪声,而神经网络却可以将其识别为猫或狗。
将原始照片添加上一些人眼不可分辨的噪声,就可以骗过神经网络,使其分类错误
那么如何提高所产生的图片质量呢?就是使用正则化方法。
一张图片里包含了高频和低频的信息,日常的照片所包含的都是低频的,因此,将高频信息过滤掉可以得到更好的结果。
但还可以更好。方法是在学习的时候对梯度进行处理,将梯度中所包含的高频成分降低,低频成分提高。
另一种方法是对输入图片进行缩放,先输入缩小后的图片,迭代若干步后,放大一点,再迭代,再放大,依次进行,直到满足所设定的条件。与放大后的图片相比,小图片相当于是低频,逐级学习使得后面的学习过程具有一个较好的初值。
下面是这种方法生成的图片的一个例子(可视化的是“狗”神经元)
领取专属 10元无门槛券
私享最新 技术干货