根据神经网络中的给定输出获取可能的输入

时间:2015-08-14 00:37:01

标签: python machine-learning neural-network

我开始学习神经网络,我刚刚制作了一个程序,学习如何识别手写数字,具有相当好的准确性(使用反向传播训练)。现在我希望能够看到网络认为完美数字看起来像什么(实质上是获得一个产生所需数字但不是来自数据集的像素数组)。我的研究空洞,但我发布在另一个网站上,并建议回顾传播。我没有太多的数学背景,所以有人能指出我正确的方向(如实现目标的任何其他方法)吗?

1 个答案:

答案 0 :(得分:1)

你可以了解一个理想的"通过反转模型并可视化输出层的权重(投影到输入层的像素上),为多类分类器神经网络(NN)中的每个类输入。

假设你有一个简单的线性分类器NN,它有784个输入(MNIST数字图像中的像素数)和10个输出(数字类的数量) - 没有隐藏层。给定输入图像z(784元素列向量)的输出图层的激活xz = f(x) = Wx + b给出,其中W是10 x 784权重矩阵, b是10元素偏差向量。

您可以轻松执行某些代数并反转此模型,以计算x给定zx = f^-1(z) = W^-1 (z - b)。现在让我们说你想看到4类的最佳输入。此类的目标输出为z = [0 0 0 0 1 0 0 0 0 0]^T;如果我们忽略当前的偏差,那么你只需要计算W的倒数的第4列(从0开始),784元素的列向量,将其重新排列成28 x 28的图像,并查看它。这是最佳输入,因为输出层激活与输入的点积和该类的权重向量成比例,因此与类4的权重向量相同的输入向量将最大化在输出层激活该类。

如果为模型添加更多层和非线性,事情会变得更复杂,但一般方法保持不变。在给定模型的目标输出x*的情况下,您希望某种方式计算最佳输入z*,但您只知道从输入到目标的(可能很复杂的)前向映射z = f(x)。您可以将此视为优化问题:您尝试计算x* = f^-1(z*),并且了解fz*。如果您对f的了解允许您以封闭形式计算符号反转,那么您只需插入z*并获取x*即可。如果你不能这样做,你总是可以使用迭代优化程序连续计算更好的近似x1x2,...,xn给出一个开始猜测{ {1}}。这是使用scipy.optimize执行此操作的一些Python伪代码:

x0

顺便提一下,这个过程基本上是最近"Inceptionism" images from Google的核心 - 优化过程试图确定复制复杂网络中特定隐藏层状态的输入像素。在这种情况下,由于卷积等原因,它更复杂,但这个想法是相似的。