chapter4. Deep Dream模型

本章主要讲了利用已经训练好的“图像识别模型inception”,绘制image的方法。通篇涉及4个code,由简到繁讲述了image的绘制过程。下面进行简要总结:

一、Deep Dream的技术原理

在实践中,我们常用“卷积神经网络”来进行“图像识别”,具体方法是:根据大量标有label的图像(x,y)来训练“卷积神经网络的梯度”,通过训练好的“卷积神经网络”,即可识别一个test sample。
那么,在训练一个“卷积神经网络”时,各个卷积层究竟会学习到什么内容?不同的卷积层学习到的内容有什么区别?
以上两个疑问均可以通过Deep Dream模型的实现来回答。
简而言之,Deep Dream就是利用“已经训练好的卷积神经网络”,来绘制图像的一个技术。在实际应用中,我们可以选择“已训练好的卷积神经网络”的某一个卷积层的output作为优化目标,而将input(也即要创作的image)作为待求解的参数,通过“梯度下降算法”求解image。
在本章节中,采用已经训练好的inception模型,作为“制图模型”。

二、简单的Deep Dream模型实现

1、简单的Deep Dream模型的实现主要有以下几大步骤:

  • 将pre-trained inception模型导入;
  • 将随机噪声image作为inception model的input;
  • 选择优化目标,即:用于制图的卷积层,将该卷积层output的平均值作为待优化目标;
  • 根据“梯度下降算法”,求解input的最优解;
  • 将求得的input保存为图像格式,即可得到图像;

2、Deep Dream模型的简易实现,见:gen_naive.py
3、生成的图形:

三、生成更大尺寸的Deep Dream模型

简易Deep Dream模型生成的是(224,224,3)大小的image,这正是初始的image_noise的大小。本小节将讲解利用image_noise生成更大尺寸图形的方法。
要想生成更大尺寸的图形,一个最直接的方法就是将input改为更大尺寸的image_noise,但是,这种做法存在一个潜在的问题,即要生成的图像越大,所需的input也会越大,计算量会越大,这样就会占据更大的内存,因此,最终,可能优于内存不足而导致“制图失败”。
一个折中的办法是:保持Input image_noise的尺寸不变,在输入image_noise以后,通过函数resize_ratio(),将其进行缩放,通过“梯度下降算法”求缩放后的image_noise_extension的最优值。
在求解image_noise_extension最优值的过程中,可以首先将image_noise_extension分割为多个部分,每次只对image_noise_extension的一个部分求最优解,这样,在每次的优化过程中都只会消耗固定的内存。而不用担心发生内存耗尽的问题。
具体的实现方法见:gen_multiscale.py
生成图形如下:

四、生成更高质量的Deep Dream模型

在上述两节中,生成的图形细节变化比较剧烈,本节将重点介绍使得“生成图像变柔和”的方法,即:“拉普拉斯金字塔梯度标准化法”。
“拉普拉斯金字塔梯度标准化”原理如下:
利用Deep Dream原理生成的图像有“高频成分”和“低频成分”两种。其中“高频成分”指图像变化比较剧烈的部分,“低频成分”指图像变化不明显的部分。要使生成的图像变柔和,则:要么增加“低频成分”,要么降低“高频成分”。
如果采用“降低高频成分”的方法,则需要针对“高频成分”加入损失,从而使生成的图像发生改变。但是,针对“高频成分”加入损失,会导致计算量和收敛步数增大。因此,我们采用“增加低频成分”的方法,来柔和图像。
为了增加“低频成分”,我们可以使用拉普拉斯金字塔标准化法(图4-5).具体可采用以下两种策略:
1)直接针对图像,来增加其低频成分,即:直接对image_noise进行拉普拉斯分层,然后,对上层图像Gl(即:低频成分)求其gradient,得到新的图像后,在将其缩放到下层图像Gl-1(即:高频成分)的到小,与下层图像Gl-1(即:高频成分)相加,得到新的Gl-1图像(即:Gl-1低频成分)。重复上述步骤,直到到达最底层,即可得到柔和的图像。
2)针对gradient,进行拉普拉斯分层。即:在每次iteration时,对求得的gradient首先进行“拉普拉斯融合”,然后,再用融合后的gradient去求此次iteration的image。本小节的图像柔和,使用的是“gradient拉普拉斯融合”。

图像柔和的实现方法见:gen_lapnorm.py
生成的图像如下:

拉普拉斯原理参见博文:图像融合之拉普拉斯融合

五、生成有背景的Deep Dream模型

以上几小节中,生成的图像均是没有背景的,如果我们想生成一个有背景的图像,可以将原始的input,由image_noise,变为背景图像image_background。
具体代码实现见:gen_deepdream.py
生成的图像如下:

猜你喜欢

转载自blog.csdn.net/u014765410/article/details/86437752