keras.models.Model的运行原理

如上图所示,基类Layer()定义了网络结构中所有层的基本属性及方法,除了图中提到的class外,keras的其他所有层类(如全连接层Dense、二维卷积层Conv2D、泛型函数Model等)都是直接或间接继承Layer()类,并通过overwrite有关Methods或增添相应的Properties及Methods而来的。

InputSpec()类用以指定网络中每一个layer的input tensor的维度数(ndim)、数据类型(dtype)、维度(shape)等属性,并在构建有关layer时用以检测该layer输入tensor(s)的兼容性。

InputLayer()类定义了每个模型网络结构的原始输入tensor的有关信息。

Node()类用以在每个layer中创建node节点,使得该layer跟与其前后有关的layers关联起来。

Container()类通过递归的方式,从模型的最终输出layer(s)层的output tensor(s)开始,根据每个layer的node信息反向递归找出模型的所有网络层信息并构建模型的整体网络图(graph)(有点类似C语言中链表结构的递归查询)。上述提到的泛型函数Model()就是通过继承Container()类而来的

======================================================================================

Node、Layer、tensor

其中:Layer()定义了网络结构中所有层的基本属性及方法,Model类继承于Container类,Container类继承于Layer类.

Node()类用以在每个layer中创建node节点,使得该layer跟与其前后有关的layers关联起来:

事实上,模型的网络流图构建完成后,node和layer都已经固定了,在图中流动的只有tensor,而不是node也不是layer。“入站节点”、“出站节点”只是一种习惯叫法,并不是说node也是动态流动的。

总的来说,node是一个桥梁,记录了各layer、tensor之间的关系;各layer又记录了与自身相关的node;而最终流动的tensor则记录了与其相关的出身信息_keras_history。因此通过最终的输出tensor可以找到其产生的层,通过这个层可以找到层中的结点,通过该节点又能更进一步地找到前一个tensor,如此往前递归搜索,就可以建立一幅完整的网络流图了。

网络流图的建立:

tensor记录了相关的出身信息==>找到其产生的层Layer==>通过层找到层中的节点Node==>通过节点找到前一个tensor。

Container()类通过递归的方式,从模型的最终输出layer(s)层的output tensor(s)开始,根据每个layer的node信息反向递归找出模型的所有网络层信息并构建模型的整体网络图(graph).

Sequential继承于Model类。

经验分享 程序员 微信小程序 职场和发展