Python 神经网络的基本理解和可视化

Python 神经网络的基本理解和可视化,python,neural-network,visualization,Python,Neural Network,Visualization,我正在写一本书,这本书从一开始就描述了神经网络,甚至没有使用numpy函数来乘向量等等 因此,我有以下代码: weights = [0.1, 0.2, 0] def w_sum(a, b): # weighted sum function assert(len(a) == len(b)) output = 0 for i in range(len(a)): output += (a[i] * b[i]) return out

我正在写一本书,这本书从一开始就描述了神经网络,甚至没有使用numpy函数来乘向量等等

因此,我有以下代码:

weights = [0.1, 0.2, 0]

def w_sum(a, b):            # weighted sum function
    assert(len(a) == len(b))
    output = 0
    for i in range(len(a)):
        output += (a[i] * b[i])
    return output

def neural_network(input, weights):
    pred = w_sum(input, weights)     #the weighted sum function with values = dot product
    return pred



info1 = [8.5, 9.5, 9.9, 9.0]
info2 = [0.65, 0.8, 0.8, 0.9]
info3 = [1.2, 1.3, 0.5, 1.0]

input = [info1[0], info2[0], info3[0]]
pred = neural_network(input, weights)

print(pred)
因此,对于这段代码,我还有以下图表:

现在:图右侧的三个节点的网络是什么?在我看来,输出似乎是相同的数字(在本例中,因为我使用的是
input=[info1[0]、info2[0]、info3[0]]
数字是:0.98) ?

为什么是这个图表?这是书中给出的。但如果它都输出相同的数字(加权和等于0.85+0.13+0.0=0.98),实际发生了什么

我的意思是,我试着理解这个图表想要告诉我什么,或者我如何阅读它

我想知道更多关于w_sum(a,b)函数的实际操作。我不理解正在发生的事情的结构,尤其是断言函数正在做什么

编辑:所以在得到启发性的答案后,我更新了图表,它实际上应该如何看待代码

非常感谢,并致以最良好的祝愿


Benjamin

好的,让我们从assert函数开始,它用于测试输入是否包含3个数字,例如,因为这是网络在其形状中接受的数字,否则它将引发错误,程序将崩溃

从图中可以看出,您现在只考虑第一个输出,这是您仅有的权重,代码中的网络是图,在输出处没有其他两个节点,只有一个节点。顺便说一下,这是一个简单的感知器模型。 它试图告诉您,以后您可以堆叠许多小型模型来创建更大的模型


w_sum()方法实际上只是对输入进行加权求和,这就是简单模型的工作原理,所以它会输入1*w1 i+input2*w2+input3*w3在这种情况下,w是模型的权重,而输入是在函数中传递的,到目前为止,你得到的是一个非常简单的神经网络,这似乎是学习更高级课程的良好第一步。它没有隐藏层,也没有激活功能。因此,是的,它目前没有什么作用,这只是网络即将推出的功能的基础

似乎您理解了图表试图告诉您的内容。目前没有什么比每个输出的加权和更重要的了

assert
语句只是检查输入的数量是否与权重的数量相关。所有的
w_sum
所做的就是将每个
输入的总和乘以它的
权重
,然后返回它。

该图(几乎)描述了完全连接的神经网络的一般结构(它缺少激活函数)

图右侧的三个节点的网络是什么

数字。从上一层派生的信息。这些数字实际上意味着什么,以及网络如何处理信息,从直观的角度来看,是一个更为困难的问题,对此你很少能得到答案(一些CNN已经被分解,以显示图像是如何通过网络转换的,以及每层提取什么样的特征)。如果您只尝试了解网络在操作层面上的工作方式(即每一层中发生的数学运算),而不是了解网络工作的原因,这对您来说会更好

至于实现,函数
w_sum()
计算两个向量(列表)
a
b
的值。它的实现基于点积的数学定义。 此外,对于要定义的点积,向量需要具有相等数量的分量(尺寸)。为了保证这一点,首先使用
assert
语句。如果你不熟悉它的功能,请仔细阅读

这里令人困惑的一点是,实现没有完全反映图表。对于这个实现,正确的图在第二层上只有一个节点(第一个)


最后请注意,列表
info0
info1
info2
在时间
i
保存第一层中节点的值。因此,在时间0时,输入向量(第一层中所有节点的值)是
[info1[0],info2[0],info3[0]]
,在时间1时是
[info1[1],info2[1],info3[1]]
,等等。

感谢Mandera的响应。我仍然在想,为什么我有三倍相同的输出。你知道我的意思吗?就像,现在每个新神经元(结)的值都是0.98。为什么呢?有没有可能,这个图只是一个更大的图的一小部分(具有相同的代码库)?是的,@Alex_P说。您的
神经网络
函数只计算一个输出。让人困惑的是,右图上的东西也是我觉得让人困惑的东西。。。。所以它实际上只输出一个节点,而不是三个。因为这三个节点的值相同,即0.98,因为只有3个权重和3个输入,所以只能定义1个输出节点。要使3个节点具有相同的值(0.98),需要9个权重(已有权重向量的2个副本)。好的。我用
[info1[0]、info2[0]、info3[0]]
添加了一个该代码和该网络在当前状态下正在做什么和输出的拟合图。现在的问题是:如果我想知道如何推进代码,它实际上正在做第一个图显示的事情(三个输出节点),你认为打开一个新的话题更好吗?这确实是一个新的话题,但你应该试着自己先弄清楚。添加更多的输出节点意味着拥有更多的权重(因此,如果您想更进一步,您的权重可以是列表列表或矩阵)并运行当前的“算法”