神经网络 - 我如何解释隐藏层对我的数据所做的事情?

机器算法验证 神经网络 数据可视化
2022-04-13 11:16:07

因此,按照本章末尾的示例,我生成了一个用于数字识别的神经网络,它(令人惊讶地)准确。它是一个784->100->10前馈网络,具有一个输入层、一个隐藏层和一个输出层。

例如,这是一个输入图像(重新整形为28x28图像):

输入图像 - 3

跑完第一层,里面有一个sigmoid激活函数:

first_layer_output = sigmoid(np.dot(weights[0],input_image)+biases[0])

我得到以下结果(减少到 100 像素,显示为10x10图像):

隐藏层之后

然后,我生成最终输出:

last_layer_output = sigmoid(np.dot(weights[1],first_layer_output)+biases[1])

具有以下输出:

输出

基本上它做出了正确的猜测。如何直观地解释输入图像发生了什么?有没有办法直观地表示每个神经元正在“寻找”什么?我使用了Tensorflow Playground,这些图层具有直观的意义。例如,像这张图这样简单的东西,我可以看到隐藏层的前两个神经元基本上只是前两个输入神经元的正负平均值:

张量流游乐场示例

在类似的尝试中,我想看看给定神经元的权重是如何改变我的图像的,所以我对输出层中权重最大的神经元的像素进行了逐个元素的乘法运算(weights[1][3]具有权重对于数字 3) 对应的输出层:

pos_n = weights[1][3].argsort()[-1]

e_by_e = np.multiply(input_image.reshape((28,28)),weights[0][pos_n].reshape((28,28)))

plt.imshow(e_by_e)

e_by_e 最重要的神经元

解释图像的正确方法是该神经元对红色像素的权重为正(根据该颜色图,红色为高),相反地减少蓝色像素的权重?所以你可以想象“3”的顶部是负权重,而“3”上半部分的“拱形”是正权重?

这是pos_n单独的神经元:

pos_n 神经元

编辑:根据@Lagerbaer 下面的建议,我训练了一个更简单的网络。该网络是一个前馈784->1->2网络,具有一个输入、一个隐藏和一个输出层,仅区分 MNIST 数据集中的 0 和 1。它的准确率 > 99%,这是权重的图像:

01s 网络的权重

1个回答

根据我自己的理解,众所周知,从复杂神经网络的权重中推断出有用的东西是非常困难的。

但是,使用 10 位数字,您可以玩一下。

不要只看权重为 3最强的隐藏层神经元,看前几个。

然后查看那些隐藏层神经元的输入权重,但尚未与输入图像相乘。这会向您显示神经元“扫描”输入图像的哪些区域。

现在,如果你启发式地思考这样一个神经网络将如何工作:它必须识别使 3 成为 3 的广泛特征,并阻止使其不是 3 的特征。因此,拱门的权重为正,a 的权重为负封闭的顶部循环(因为这可能是匆忙写的 9 代替)。

问题是它变得相当复杂很快。作为一个更简单的练习,您可以尝试构建一个较小的神经网络,该网络仅区分两个相对不同的形状,并从那里建立您的直觉。