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

我刚开始学习神经网络,并且我刚刚编写了一个程序,能够以相当高的准确率识别手写数字(使用反向传播进行训练)。现在我想看看网络认为一个完美的数字是什么样子的(本质上是获取一个像素数组,该数组能产生所需的数字,但不来自数据集)。我的研究没有找到答案,但在另一个网站上发帖后,有人建议我尝试反向传播到输入。我的数学背景不是很强,所以能否有人指导我如何实现这个方法(或者其他任何能达到我目标的方法)?


回答:

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

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

你可以通过一些代数运算轻松地反转这个模型,以计算给定zxx = 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的权重向量相同的输入向量将在输出层最大化激活该类别。

如果模型中增加了更多的层和非线性,事情会变得更加复杂,但总体方法保持不变。你希望找到一种方法,计算给定目标输出z*的最佳输入x*,但你只知道从输入到目标的(可能复杂的)前向映射z = f(x)。你可以将其视为一个优化问题:你试图计算x* = f^-1(z*),你知道fz*。如果你的f知识允许你计算出符号逆的闭合形式,那么你可以直接将z*代入并得到x*。如果你不能这样做,你总是可以使用迭代优化程序来计算从初始猜测x0开始的逐步更好的近似值x1x2、…、xn。以下是使用scipy.optimize进行此操作的Python伪代码:

import numpy as npimport scipy.optimize# 我们的前向模型,已训练的权重和偏置的配对层。weights = [np.array(...) ...]biases = [np.array(...) ...]def f(x):    for W, b in zip(weights, biases):        # relu激活。        x = np.clip(np.dot(W, x) + b, 0, np.inf)    return x# 我们瞄准第4类。zstar = np.array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0])# 我们想要优化的损失:最小化zstar和f(x)之间的差异。def loss(x):    return abs(f(x) - zstar).sum()x0 = np.zeros(784)result = scipy.optimize.minimize(loss, x0)

顺便说一下,这个过程基本上是最近谷歌的“Inceptionism”图像的核心——优化过程试图确定能够复制复杂网络中特定隐藏层状态的输入像素。在这种情况下,由于卷积等因素,情况更为复杂,但想法是相似的。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注