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

时间:2015-06-23 05:32:05

标签: 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

我的问题:这篇文章将此描述为一个简单的' case - 是否有一个nn的开源实现,可以在相对即插即用的过程中用于此目的? 对于所描述的技术,网络是否需要接受培训?

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

2 个答案:

答案 0 :(得分: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应该看起来像#34;自然图像" (没有高频噪音)。

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)的渐变。至于公式的主要部分,我设法找到了这个方式:

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

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

增强第四层的结果:

Result of enhancing the 4th layer

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

答案 1 :(得分:5)

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

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

这是理解gradient ascent的一个很好的链接,虽然它主要讨论梯度下降。

我对caffe中的实现细节知之甚少,因为我主要使用theano。希望它有所帮助!

<强>更新

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

  

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

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