使用 nolearn\lasagne 制作神经网络来绘制图像(又名 Google 的起始论)

Making neural net to draw an image (aka Google's inceptionism) using nolearn\lasagne

可能很多人已经通过 Google 研究看到了这篇文章:

http://googleresearch.blogspot.ru/2015/06/inceptionism-going-deeper-into-neural.html

它描述了 Google 团队如何让神经网络像人工智能艺术家一样实际绘画 :)

我想做一些类似的事情只是为了看看它是如何工作的,并可能在未来使用它来更好地理解是什么导致我的网络失败。问题是 - 如何使用 nolearn\lasagne(或者 pybrain - 它也可以,但我更喜欢 nolearn)来实现它。

更具体地说,来自 Google 的人训练了一个具有某种架构的 ANN 来对图像进行分类(例如,对照片上的鱼进行分类)。好吧,假设我在 nolearn 中构建了一个具有某种架构的 ANN,并且我已经进行了一定程度的训练。但是……接下来怎么办?我没有从他们的文章中得到它。他们似乎并不只是将某些特定层的权重可视化。在我看来(也许我错了)他们做了以下两件事之一:

1) 将一些现有图像或纯随机噪声馈送到训练有素的网络,并可视化其中一个神经元层的激活。但是 - 看起来并不完全正确,因为如果他们使用卷积神经网络,层的维数可能会低于原始图像的维数

2) 或者他们将随机噪声提供给经过训练的 ANN,从其中一个中间层获取其中间输出并将其反馈回网络 - 以获得某种循环并检查神经网络层认为可能是什么在外面的随机噪音中。但同样,由于与#1

中相同的维度问题,我可能是错的

所以...有什么想法吗?我们如何使用 nolearn 或 pybrain 做与 Google 在原始文章中所做的类似的事情?

From their ipython notebook on github:

Making the "dream" images is very simple. Essentially it is just a gradient ascent process that tries to maximize the L2 norm of activations of a particular DNN layer. Here are a few simple tricks that we found useful for getting good images:

  • offset image by a random jitter
  • normalize the magnitude of gradient
  • ascent steps apply ascent across multiple scales (octaves)

它是使用卷积神经网络完成的,你说的正确,激活的维度将小于原始图像,但这不是问题。

您可以通过 forward/backward 传播的迭代来更改图像,就像您通常训练网络的方式一样。在前向传播中,您只需要一直走到您要处理的特定层。然后在向后传递时,您将传播回网络的输入而不是权重。

因此,您不是找到关于损失函数的权重梯度,而是找到关于一组特定激活的 l2 归一化的输入梯度。