UPD:谷歌发布了他们如何实现它的更多详细说明:https://github.com/google/deepdream/blob/master/dream.ipynb
还有另一个项目:https://317070.github.io/Dream/
如果你读过1,[2],[3],[4] 从您的链接中,您会看到他们使用了 Caffe。该框架已经包含了可供使用的经过训练的网络。您不需要手动训练任何内容,只需使用 .sh 脚本下载模型即可models/
folder.
你想要“即插即用的过程”,这并不容易,因为除了框架之外,我们还需要他们使用的脚本的代码,可能还需要修补 Caffe。我尝试用他们的描述做一些东西。 Caffe 有 Python 和 Matlab 接口,但其内部还有更多内容。
下面的文字描述了我对如何实现它的想法。我不确定我的话,所以这更像是邀请我一起研究,而不是“即插即用过程”。但由于还没人回答,所以我就放在这里了。也许有人会修复我。
So
据我了解,他们进行了优化
[sum((net.forwardTo(X, n) - enchanced_layer).^2) + lambda * R(X)] -> min
IE。寻找这样的输入X
以便网络的特定层将产生“增强”数据而不是“原始”数据。
存在正则化约束R(X)
: X
应该看起来像“自然图像”(没有高频噪声)。
X
是我们的目标图像。初始点X0
是原始图像。forwardTo(X, n)
是我们的网络在层中产生的n
当我们用 X 提供输入时。如果谈论咖啡,您可以进行全前向传递(net.forward
)并查看您感兴趣的斑点(net.blob_vec(n).get_data()
).
enchanced_layer
- 我们采用原始图层斑点并在其中“增强”信号。这是什么意思,我不知道。也许他们只是将值乘以系数,也许是其他东西。
Thus sum((forwardTo(X, n) - enchanced_net).^2)
当您的输入图像在图层中准确生成您想要的内容时,该值将变为零n
.
lambda
是正则化参数,R(X)
is how X
看起来很自然。我没有实现它,我的结果看起来很吵。至于它的公式,你可以在[2]中查找。
我用Matlab和fminlbfgs
来优化。
关键部分是找到上面公式的梯度,因为问题的维度太多,无法用数值方法计算梯度。
正如我所说,我没能找到梯度R(X)
。至于公式的主要部分,我设法这样找到:
- 在图层上设置 diff blob
n
to forwardTo(X, n) - enchanced_net
。 (参见caffe文档set_diff
and set_data
, set_data
用于转发和等待数据set_diff
用于反向传播并等待数据错误)。
- Perform partial从层反向传播
n-1
到输入。
- 输入 diff blob 将包含我们需要的梯度。
Python 和 Matlab 接口不包含部分反向传播,但 Caffe C++ 内部包含它。我在下面添加了一个补丁,使其可以在 Matlab 中使用。
第四层增强结果:
我对结果并不满意,但我认为与这篇文章有一些共同点。
- 这是“按原样”生成上面图片的代码。入口点是“run2.m”,“fit2.m”包含适应度函数:https://github.com/galchinsky/caf
- 这是 Matlab 接口的 caffe 补丁,使部分反向传播可用:https://gist.github.com/anonymous/53d7cb44c072ae6320ff