Keras核心笔记——类结构

综述

在以mxnet/gluon这个超简洁又强大的命令式框架入门的本人眼里,keras2的类层次结构非常繁杂
例如 它里面似乎把Model和一般的Layer分开对待
但是如果一个layer是一个函数fx,那么将一群函数以何种方式堆叠起来,比如复合,或者叠加,得到的仍然是一个函数,按这个来看,layer的容器就应该是layer本身,这样比较符合逻辑

对比

mxnet/gluon

mxnet/gluon中,完美地贯彻了这个逻辑,序贯模型,其本质上仍然可以被当作一个function对待,或者当作一个layer对待,其除了可以用add函数添加子layer外,并没有什么特殊的地方,可以把它看作一个方便使用的小福利
并且,查看源代码可以发现,其直接继承于Block类,这个类是“神经网络函数”的基类,任何一个layer也继承于此类,整体来说其继承结构比较平坦

keras

而keras2中,序贯模型继承自Model,而Model继承自Container
Container才继承于Layer类,这个Layer类才是所有层的最终基类

综合

查看源码可以发现 keras的代码要复杂的多,而且也难读的多,例如从序贯模型类开始跟踪,进入一个名字叫models.py的文件
这个文件有1500多行,而mxnet/gluon,跟踪进入basic_layers.py文件,整个文件只有不到500行
同时gluon的源代码组织非常清晰,几乎没有重复代码
没有堆砌的代码,不看注释基本都能迅速读懂意思,而keras则是有大量参数,在网络的构造,编译,训练,预测阶段有一套完整的生命周期,在每一个layer的类中往往是存在大量的对外接口,而gluon写一个layer甚至只需要写一个函数完成一次原始的NDArray运算就好

总结

mxnet/gluon是个动态图框架,其依靠mxnet得到了卓越的性能,从pytorch中吸取经验,又有了一套对用户极其友好的接口,非常适合科研使用,其开发速度快,灵活,代码直观容易修改,并且其使用时不感觉向堆积木,而是真正像在做数学工作,这点非常难得

你可能感兴趣的:(Keras核心笔记——类结构)