9

我对谷歌最近的一篇博客文章很感兴趣,该文章描述了nn艺术创作的用途。

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

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

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

我的问题:这篇文章将其描述为一个“简单”的案例——是否有一个 nn 的开源实现可以在相对即插即用的过程中用于此目的?对于所描述的技术,是否需要训练网络?

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

4

2 回答 2

9

UPD:谷歌发布了他们如何实现它的更详细说明: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是原始图像。 forwardTo(X, n)是当我们用 X 提供输入时我们的网络在层中产生的n结果。如果谈到 Caffe,您可以进行全前向传递 ( net.forward) 并查看您感兴趣的 blob ( net.blob_vec(n).get_data())。

enchanced_layer- 我们在其中获取原始层 blob 和“增强”信号。什么意思,我不知道。也许他们只是将值乘以系数,也许是别的。

因此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 文档中的set_diffand set_dataset_data用于转发并等待数据,set_diff用于反向传播并等待数据错误)。
  • 执行从层到输入的部分反向传播。n-1
  • 输入差异 blob 将包含我们需要的梯度。

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

增强第四层的结果:

增强第四层的结果

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

于 2015-06-24T14:07:25.683 回答
5

在提供的 Ipython 笔记本 Dmitry 的链接中,它说它通过最大化L2 归一化来进行梯度 上升。我相信这就是谷歌从算法角度增强功能的意思。

如果你仔细想想,确实是这样,最小化 L2 可以防止过拟合,即使曲线看起来更平滑。如果你反其道而行之,你就会使这个特征更加明显。

这是理解梯度上升的一个很好的链接,尽管它主要讨论梯度下降。

我不太了解 caffe 中的实现细节,因为我主要使用 theano。希望能帮助到你!

更新

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

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

因此,在对网络进行分类训练后,您再次对输入图像进行训练,使用梯度上升以获得该类的更高分数。

于 2015-07-29T18:34:46.807 回答