Artificial intelligence Google Deep Dream art:如何在神经网络中选择一层并增强它

Artificial intelligence Google Deep Dream art:如何在神经网络中选择一层并增强它,artificial-intelligence,neural-network,deep-learning,caffe,deep-dream,Artificial Intelligence,Neural Network,Deep Learning,Caffe,Deep Dream,我对谷歌最近的一篇博文很感兴趣,这篇博文描述了如何使用nn制作艺术品 我对一种技术特别感兴趣: “在这种情况下,我们只需向网络提供任意图像或照片,并让网络分析图片。然后,我们选择一层并要求网络增强它检测到的任何内容。网络的每一层都在不同的抽象层次上处理特征,因此我们生成的特征的复杂性取决于我们选择增强哪一层。例如,较低的层次倾向于产生笔画或简单的装饰性图案,因为这些层次对边缘及其方向等基本特征敏感 这个职位是 我的问题:这篇文章将此描述为一个“简单”的案例——是否有一个nn的开源实现可以在相对即

我对谷歌最近的一篇博文很感兴趣,这篇博文描述了如何使用
nn
制作艺术品

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

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

这个职位是

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


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

UPD:Google发布了更详细的说明,说明了他们是如何实现它的:

还有一个项目:

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

您需要“即插即用过程”,这并不容易,因为除了框架之外,我们还需要他们使用的脚本的代码,可能还有补丁Caffe。我试着用他们的描述做点什么。Caffe有Python和Matlab接口,但其内部还有更多

下面的文本描述了我对如何实现它的想法。我不确定我的话,所以这更像是邀请我一起研究,而不是“即插即用过程”。但是由于没有人回答,让我把它放在这里。也许有人会治好我

所以

据我所知,他们运行优化

[sum((净转发到(X,n)-增强层)。^2)+lambda*R(X)]->min

即,查找此类输入
X
,以便网络的特定层将生成“增强”数据,而不是“原始”数据

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

X
是我们的目标图像。初始点
X0
是原始图像。
forwardTo(X,n)
是我们的网络在层
n
中产生的,当我们用X馈送输入时。如果谈到Caffe,您可以进行完全向前传递(
net.forward
)并查看您感兴趣的blob(
net.blob\u vec(n).get\u data()

增强层
-我们将原始层块和“增强”信号放入其中。这是什么意思,我不知道。也许他们只是把这些值乘以系数,也许是别的

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

lambda
是正则化参数,
R(X)
X
看起来自然的方式。我没有实现它,我的结果看起来非常嘈杂。至于它的公式,你可以在[2]中找到

我使用Matlab和
fminlbfgs
进行优化

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

正如我所说,我没有找到
R(X)
的梯度。至于公式的主要部分,我是这样找到的:

  • 将层
    n
    上的diff blob设置为
    forwardTo(X,n)-enchanced\u net
    。(参见caffe文档了解
    set_diff
    set_data
    set_data
    用于转发和等待数据,
    set_diff
    用于反向传播和等待数据错误)
  • 执行从层
    n-1
    到输入的部分反向传播
  • 输入diff blob将包含我们需要的梯度

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

增强第4层的结果:

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

  • 下面是生成上述“原样”图片的代码。入口点为“run2.m”,“fit2.m”包含适应度函数:
  • 以下是caffe到Matlab接口的补丁,以使部分反向传播可用:

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

如果你仔细想想,事实确实如此,最小化L2可以防止过度拟合,即使曲线看起来更平滑。如果你做了相反的事情,你会使这个特性更加明显

这里有一个很好的链接可以理解,尽管它主要讨论梯度下降

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

更新

因此,我今天阅读了详细的文章[1]、[2]、[3]、[4],发现它实际上详细讨论了算法

通过反向传播可以找到一个局部最优I 方法。程序