Google Deep Dream艺术:如何在神经网络中选择一个层并对其进行增强

use*_*er0 9 artificial-intelligence neural-network deep-learning caffe deep-dream

我对Google最近发表的一篇博客文章感兴趣,该博客描述了nn制作艺术品的用途.

我对一种技术特别感兴趣:

'在这种情况下,我们只需向网络提供任意图像或照片,让网络分析图片.然后,我们选择一个层,并要求网络增强检测到的内容.网络的每一层都处理不同抽象层次的特征,因此我们生成的特征的复杂性取决于我们选择增强的层.例如,较低层往往会产生笔画或简单的装饰状图案,因为这些图层对基本特征(如边缘及其方向)很敏感.

该帖子是http://googleresearch.blogspot.co.uk/2015/06/inceptionism-going-deeper-into-neural.html?m=1.

我的问题:帖子将此描述为一个"简单"的案例 - 是否有一个nn的开源实现可以在相对即插即用的过程中用于此目的?对于所描述的技术,网络是否需要经过培训?

毫无疑问,本文中提到的其他技术需要一个已经在大量图像上训练过的网络,但对于我所描述的那个,已经存在某种开源网络层可视化包?

Dmi*_*sky 9

UPD:Google发布了更多详细说明,说明了它们是如何实现的:https://github.com/google/deepdream/blob/master/dream.ipynb

还有另一个项目:https://317070.github.io/Dream/

如果您从链接中读取1,[2],[3],[4],您会看到他们使用了Caffe.该框架已包含经过培训的网络.您无需手动训练任何内容,只需使用models/文件夹中的.sh脚本下载模型即可.

你想要"即插即用过程",它并不那么容易,因为除了框架之外,我们还需要他们使用的脚本代码,可能还需要修补Caffe.我尝试使用他们的描述制作一些东西.Caffe有Python和Matlab接口,但内部有更多.

下面的文字描述了我对如何实施它的想法.我不确定我的话,所以它更像是邀请我研究而不是"即插即用过程".但是,由于没有人仍然回答,让我把它放在这里.也许有人会解决我的问题.

所以

据我了解,他们进行优化

[sum((net.forwardTo(X, n) - enchanced_layer).^2) + lambda * R(X)] -> min

即寻找这样的输入,X以便网络的特定层将产生"增强的"数据而不是"原始"数据.

有一个正则化约束R(X):X应该看起来像"自然图像"(没有高频噪声).

X是我们的目标形象.初始点X0是原始图像. 当我们用X输入输入时,我们的forwardTo(X, n)网络在层中产生的内容n.如果谈论Caffe,你可以进行全向前传递(net.forward)并查看你感兴趣的blob(net.blob_vec(n).get_data()).

enchanced_layer - 我们采用原始图层blob和"enchance"信号.这是什么意思,我不知道.也许他们只是将数值乘以系数,也许是别的东西.

因此,sum((forwardTo(X, n) - enchanced_net).^2) 当您的输入图像在图层中生成您想要的内容时,它将变为零n.

lambda是调整参数以及R(X)是如何X看起来自然.我没有实现它,我的结果看起来很吵.至于它的公式,你可以在[2]中找到它.

我使用Matlab fminlbfgs进行优化.

关键部分是找到上面公式的梯度,因为问题的维度太多,无法用数字计算梯度.

正如我所说,我没有找到梯度R(X).至于公式的主要部分,我设法找到它:

  • 将图层中的diff blob设置nforwardTo(X, n) - enchanced_net.(参见caffe文档for set_diffset_data,set_data用于转发和等待数据,set_diff用于向后传播并等待数据错误).
  • 从图层到输入执行部分反向传播n-1.
  • 输入diff blob将包含我们需要的渐变.

Python和Matlab接口不包含部分向后传播,但Caffe C++内部包含它.我在下面添加了一个补丁,以便在Matlab中使用它.

增强第四层的结果:

增强第4层的结果

我对结果不满意,但我认为这篇文章有一些共同之处.


Kew*_* Qu 5

在提供的Ipython笔记本链接中,它表示它通过最大化 L2规范化进行渐变 上升.我相信这就是谷歌从算法角度来强化功能的意思.

如果您考虑一下,情况确实如此,最小化L2可以防止过度拟合,即使曲线看起来更平滑.如果你做相反的事情,你就会使这个特征变得更加明显.

这是了解渐变上升的一个很好的链接,虽然它主要讨论梯度下降.

我对caffe中的实现细节知之甚少,因为我主要使用theano.希望能帮助到你!

更新

所以我今天阅读了详细的文章[1],[2],[3],[4],并发现[3]实际上详细讨论了算法

通过反向传播方法可以找到局部最优的I. 该过程与ConvNet训练过程有关,其中反向传播用于优化层权重.不同之处在于,在我们的情况下,优化是针对输入图像执行的,而权重是固定在训练阶段期间找到的.我们用零图像初始化优化(在我们的例子中,ConvNet是在零中心图像数据上训练的),然后将训练集平均图像添加到结果中.

因此,在对网络进行分类训练之后,再次使用渐变上升对输入图像进行训练,以获得更高的分数.