我已经构建了一个基本的多层感知器,可以从MNIST数据集中学习。 学习之后,我想从输出中获取输入,这意味着反转前馈功能以获得网络生成的图像。
我的整个代码与https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/src/network.py
类似前馈功能如下:
def feedforward(self, a):
"""Return the output of the network if ``a`` is input."""
for b, w in zip(self.biases, self.weights):
a = sigmoid(np.dot(w, a)+b)
return a
如果我尝试使用np.linalg.pinv来反转它,它就不起作用,因为在某些时候我必须反转一个向量并且解决方案不是唯一的,例如:
m = np.array([[3, 4]])
n = np.array([[1], [2]])
o = np.dot(m,n)
print(np.dot(np.linalg.pinv(m),o)) #not n
我被困在那里。我认为我需要一个hack来使np.linalg.pinv的输出更加连贯,因为因为它不能设法检索实际输入,因为sigmoid函数的逆表达式中存在对数,并且由于np.linalg.pinv给出的值,我最终得到负数,导致NaN无处不在。
有什么想法吗?
PS:最终目标是将随机噪音馈入网络并观看数字,因此我从http://googleresearch.blogspot.fr/2015/06/inceptionism-going-deeper-into-neural.html 中选择了梦想表达答案 0 :(得分:3)
如果我理解正确,则无需以任何方式反转网络,但您应创建一个随机图像并将其提供给网络并查看其执行情况。 现在,您逐渐更改输入图像,使输出更接近您希望的输出。此外,您应该尝试使相邻像素在强度上彼此相似。
(这基本上就是所提供的链接所说的内容。)