2.5 实现多个隐藏层
现在我们回顾一下,在chapter2_Create_AI_Framework的NetworkStructure.py(v1)中,神经元网络不同层次的信息还没有设置,本节就来对神经元节点设置层次信息。
在chapter2_Create_AI_Framework版本的NetworkStructure.py在NetworkStructure.py(v1)微调:
(1)在NetworkStructure.py(v1)代码第15行之后新增一行代码,增加对输入层偏爱因子节点的层次设置。输入层偏爱因子层次设置为0。
(2)在NetworkStructure.py(v1)代码第32行之后新增一行代码,增加对隐藏层偏爱因子节点的层次设置。隐藏层偏爱因子节点层次设置为i+1,隐藏层的层次i从0开始,因此加上1。
(3)在NetworkStructure.py(v1)代码第45行之后新增一行代码,增加对隐藏层神经元节点的层次设置。隐藏层神经元节点层次设置为i+1,隐藏层的层次i从0开始,因此加上1。
(4)在NetworkStructure.py(v1)代码第59行之后新增一行代码,增加对输出层神经元节点的层次设置。输出层神经元节点层次设置为1 + len(hidden_layers),层次数加1。
回顾一下,在chapter2_Create_AI_Framework的NetworkStructure.py(v1)对输入层的节点还没有创建,这里加上输入层节点的创建代码,输入层节点跟输入的特征有关系。
在NetworkStructure.py(v1)代码中第25行之后新增代码。
第26行代码:for循环遍历输入特征数,创建输入层神经元节点。i索引值从0开始。
第27行代码:打印输入层节点的信息,格式为V和i+1的信息。
第29行代码:设置输入层神经元节点的层次信息。
第32行代码:设置输入层神经元节点的set_is_bias_unit为False,创建的是输入层神经元节点本身,而不是偏爱因子节点。
如图2-21所示,输入层在已经创建的偏爱因子之后增加创建神经元节点。
图2-21 创建输入层节点
至此已经初步实现了NetworkStructure.py神经元节点构建、NetworkConnection.py神经网络层次的权重连接。回到入口程序chapter2_Create_AI_Framework的Neuron_Network_Entry.py(v1),调用NetworkConnection.create_Weights权重连接:
- Neuron_Network_Entry.py(v1)第15行以后新增代码。在NetworkConnection.create_Weights方法中传入nodes,num_of_features, hidden_layers参数。
- 新增代码,打印神经元节点中哪些节点是偏爱因子节点。
运行入口程序chapter2_Create_AI_Framework的Neuron_Network_Entry.py代码,运行结果如下:在hidden_layers=[4,2]时,运行结果的第1行中的第一个“+1”表示输入层的偏爱因子节点名字,V1表示输入层的第一个输入节点,V2表示输入层的第2个输入节点;第2行“Hidden layer creation”的1是第1层隐藏层偏爱因子的名字,之后是第一个隐藏层的4个神经元节点的名字。第3行“Hidden layer creation”的2是第2层隐藏层偏爱因子的名字,之后是第2个隐藏层的2个神经元节点的名字。第4行打印输出层的节点名字Output;第5~16行的记录打印了节点是否为偏爱因子的节点;第17~49行的记录打印了层次之间节点的权重信息。
以上第17~49行记录打印的层之间的权重连接关系如图2-22所示。
图2-22 权重连接包含偏爱因子节点的神经网络图
NetworkConnection.py代码中构成权重的前提条件是有前后相邻的层关系,权重是发生在神经元节点之间的,跟偏爱因子没关系,比较的节点之间不能是偏爱因子成员,所以要去掉偏爱因子的节点。图中第0个节点、第3个节点、第8个节点都是偏爱因子节点,也进行了权重的计算,权重的连接不应包括偏爱因子的节点,因此,接下来的工作需将偏爱因子从权重连接关系中去掉。
在chapter2_Create_AI_Framework版本的NetworkConnection.py(v1)的基础上进行微调:
在NetworkConnection.py(v1)的30行代码之后新增代码,判断nodes[k]、nodes[j]节点是否为偏爱因子节点。
再次运行入口程序chapter2_Create_AI_Framework的Neuron_Network_Entry.py代码,运行结果如下:这里是hidden_layers=[4,2]为两个隐藏层,第一个隐藏层有4个神经元,第二个隐藏层有2个神经元。整个神经网络有12个节点,其中ID为0、3、8的Node为偏爱因子节点,ID为1、2的是输入层,分别关联到4、5、6、7节点,然后4、5、6、7节点分别关联到下一个隐藏层的节点9、10节点;9、10节点最后输出到输出层节点ID 11,打印出各权重的结果。此时的第16~33行记录中权重连接已经不包括偏爱因子节点的信息:
代码调整以后,第16~33行记录的层之间的权重连接关系如图2-23所示,此时,盘古人工智能框架的神经网络权重关系图和TensorFlow的可视化图是类似的,权重连接已经不包括偏爱因子节点,如图2-23所示。
图2-23 权重连接去掉偏爱因子节点的神经网络图