keras这个框架简洁优美,设计上堪称典范。而tensorflow就显得臃肿庞杂,混乱不清。当然,keras的周边部件比如callbacks、datasets、preprocessing有许多过度设计的感觉,但是keras的核心是好的,这个设计完美的核心使得这个系统可扩展性极强、代码逻辑性极强。然而,其中因为依旧有一些小细节,一旦理解不透,就会对keras的原理有“神奇”之感,比如本文接下来要讲的这个问题:callbacks中的stop_training。
keras的Model#fit()函数接受一个callback列表,在训练的不同阶段会触发callback的不同操作。其中这些阶段包括:
- 训练开始和结束
- 批次开始和结束
- 轮次开始和结束
callback列表中的元素都是Callback的派生类的实例。每个Callback派生类都可以选择性的重写以上六个函数。
其中callback中常用的一种操作是:callback_model.stop_training=True or False
。
callback_model
是每个Callback实例的成员变量,它对应的类型也就是Model。
但是Model并没有stop_training
这个成员变量,Model继承自Network,Network也没有这个成员变量。stop_training
这个属性唯一出现的两个地方就是:callbacks.py中定义回调接口的时候,train_array.py执行训练操作的时候。
这个属性仿佛从天而降、无中生有。
实际上,Model的父类Network实现了__setattr__
函数,这样就可以随意往Network上“悬挂”变量了,Model当然也继承了这样的特点。