Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据神经网络中给定的输出获取可能的输入_Python_Machine Learning_Neural Network - Fatal编程技术网

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

Python 根据神经网络中给定的输出获取可能的输入,python,machine-learning,neural-network,Python,Machine Learning,Neural Network,我开始学习神经网络,我刚刚制作了一个程序,学习如何以相当高的精度识别手写数字(通过反向传播训练)。现在我想看看网络认为一个完美的数字是什么样子的(基本上是得到一个像素阵列,它产生一个想要的数字,但不是来自数据集)。我的研究结果是空的,但我在另一个网站上发表了文章,有人建议我考虑对输入进行反向传播。我没有太多的数学背景,所以有人能告诉我如何实现这一目标(或实现我目标的任何其他方法)的正确方向吗?通过反转模型并可视化输出层的权重,你可以了解多类分类器神经网络(NN)中每个类的“理想”输入,投影到输入

我开始学习神经网络,我刚刚制作了一个程序,学习如何以相当高的精度识别手写数字(通过反向传播训练)。现在我想看看网络认为一个完美的数字是什么样子的(基本上是得到一个像素阵列,它产生一个想要的数字,但不是来自数据集)。我的研究结果是空的,但我在另一个网站上发表了文章,有人建议我考虑对输入进行反向传播。我没有太多的数学背景,所以有人能告诉我如何实现这一目标(或实现我目标的任何其他方法)的正确方向吗?

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

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

你可以做一些代数运算并简单地反转这个模型,来计算给定的
z
x=f^-1(z)=W^-1(z-b)
。现在让我们假设您希望看到
4
类的最佳输入。该类的目标输出将是
z=[0 0 1 0 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*
。如果您不能做到这一点,您可以始终使用迭代优化过程,在给定
x0
的起始猜测的情况下,依次计算更好的近似值
x1
x2
,…,
xn
。下面是一些Python伪代码,用于使用:


顺便说一句,这个过程基本上是最新研究的核心——优化过程试图确定在复杂网络中复制特定隐藏层状态的输入像素。在这种情况下,由于卷积等问题比较复杂,但其思想是相似的。

对于数学背景/可行性考虑考虑<代码> STATS < /代码>。回答这个问题需要对统计学有一定的深刻理解。可能不太适合stackoverflow。您所说的“识别”是指您已经训练了10类分类模型吗?
import numpy as np
import scipy.optimize

# our forward model, paired layers of already-trained
# weights and biases.
weights = [np.array(...) ...]
biases = [np.array(...) ...]
def f(x):
    for W, b in zip(weights, biases):
        # relu activation.
        x = np.clip(np.dot(W, x) + b, 0, np.inf)
    return x

# set our sights on class #4.
zstar = np.array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0])

# the loss we want to optimize: minimize difference
# between zstar and f(x).
def loss(x):
    return abs(f(x) - zstar).sum()

x0 = np.zeros(784)
result = scipy.optimize.minimize(loss, x0)