ForwardPropagation是个业务类,在ForwardPropagation.py编写之前,因为每个神经元的分析都有计算的结果,我们需先对Node.py代码进行修改。例如,TensorFlow的可视化图中,第一个隐藏层的第一个神经元要接收输入层的数据进行处理得出结果,每个神经元会有2个新的功能,一个功能是存储接收到的数据,另外一个功能是存储计算的结果。
Create_AI_Framework_In5Classes(Day2)版本的Node.py,与Create_AI_Framework_In5Classes(Class1)版本的Node.py版本相比:上段代码第38行之后新增代码,新增set_input_value、get_input_value、set_value、get_value的方法。
线性变换的过程:
Node.py的set_input_value方法获得上一个Layer中所有和自己有Weight关系的Neron的Values并设置给当前的Neuron。和自己有Weight关系的Neron一般会有多个节点。Node.py的get_input_value(self)方法的参数需传入self,不传将变成静态方法。
get_input_value获取的是当前神经元Node节点的值,将上一层神经元的值传过来,经过计算将值设置进去,这个过程是线性变换的过程。get_input_value获得当前Neuron中接收到的上一个Layer中所有和自己有Weight关系的Neron的Values。
非线性变换的过程:
当前的Neuron对接受到的输入源的所有数据进行非线性(Non-Linearity)的处理后会产生具体的结果,使用setter和getter把来存储和访问该非线性计算结果。Node.py的set_value方法获得经过非线性计算后的结果并设置给当前的Neuron。Node.py的get_value方法获得当前Neuron的Value。
修改完Node.py代码以后,接下来进行最核心的Forward Propagation业务类代码的编写,这是最关键的部分。在service目录下创建ForwardPropagation.py文件,完成从输入层Input Layer,经过若干层的隐藏层Hidden Layers,最后得出输出层Output Layer的值。在ForwardPropagation.py文件中编写class ForwardPropagation类,定义一个applyForwardPropagation方法从神经元网络的最左侧运行到最右侧,applyForwardPropagation方法是一个工具方法,也是一个业务逻辑方法,但不是一个实例的方法,不需要创建类的实例来调用,因此不需要传入self参数。applyForwardPropagation方法中传入的第一个参数为nodes, nodes是所有的节点;传入的第二个参数为weights, 例如,TensorFlow的可视化图中,从输入层的第一个节点,运行下一步到第一个隐藏层的第一个节点,连接两者的只有权重,这里传入所有的权重。传入的第三个参数为instance,将对输入数据计算一遍,例如instances第一行[0,0,0]是输入数据,第一个0作为x1的数据,第二个0作为x2的数据,经过一系列处理,最后得出一个计算结果(结果可能是0,有可能是其他的数字),所以传入的参数是一个训练实例instance。
ForwardPropagation.py的applyForwardPropagation:
这里我们先不实现applyForwardPropagation方法,而在
Create_AI_Framework_In5Classes(Class1)的Neuron_Network_Entry.py代码末尾新增代码,在Create_AI_Framework_In5Classes(Day2)的Neuron_Network_Entry.py入口程序中先调用applyForwardPropagation方法:
instances中的每个实例instance都会运用一下applyForwardPropagation方法,因此需
循环遍历instances。这里instances有4个实例,分别为[0,0,0], [0,1,1], [1,0,1], [1,1,0],每次只处理一个instance,instances[i]从0开始索引。然后调用ForwardPropagation.applyForwardPropagation方法,applyForwardPropagation方法传入的第一个参数是所有的节点,传入的第二个参数是weights,传入的第三个参数是instance,然后进行训练,训练之后会得到计算结果,最后我们打印输出的结果。注意:输入的实例这里是指输入instances的第1列数据,第2列数据,instances的第3列是真实的结果,训练的结果和真实的结果可能不一致。
欢迎关注微信公众号:“从零起步学习人工智能”。