我开始学习神经网络,我刚刚制作了一个程序,学习如何识别手写数字,具有相当好的准确性(使用反向传播训练)。现在我希望能够看到网络认为完美数字看起来像什么(实质上是获得一个产生所需数字但不是来自数据集的像素数组)。我的研究空洞,但我发布在另一个网站上,并建议回顾传播。我没有太多的数学背景,所以有人能指出我正确的方向(如实现目标的任何其他方法)吗?
答案 0 :(得分:1)
你可以了解一个理想的"通过反转模型并可视化输出层的权重(投影到输入层的像素上),为多类分类器神经网络(NN)中的每个类输入。
假设你有一个简单的线性分类器NN,它有784个输入(MNIST数字图像中的像素数)和10个输出(数字类的数量) - 没有隐藏层。给定输入图像z
(784元素列向量)的输出图层的激活x
由z = f(x) = Wx + b
给出,其中W
是10 x 784权重矩阵, b
是10元素偏差向量。
您可以轻松执行某些代数并反转此模型,以计算x
给定z
:x = 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*)
,并且了解f
和z*
。如果您对f
的了解允许您以封闭形式计算符号反转,那么您只需插入z*
并获取x*
即可。如果你不能这样做,你总是可以使用迭代优化程序连续计算更好的近似x1
,x2
,...,xn
给出一个开始猜测{ {1}}。这是使用scipy.optimize
执行此操作的一些Python伪代码:
x0
顺便提一下,这个过程基本上是最近"Inceptionism" images from Google的核心 - 优化过程试图确定复制复杂网络中特定隐藏层状态的输入像素。在这种情况下,由于卷积等原因,它更复杂,但这个想法是相似的。