上篇文章,只读了一行,就是118行。今天继续。保持冷静,不急不躁,切实要求自己,将每一行真正看懂后再继续。
108-175
读到这里,对_per_input之类的属性有了更系统的理解。简单说,就是某个变量如果是和某几个input有关,就用这几个input创建一个key,变量的值作为value。比如,loss,update都是这样的,这在前面的阅读代码中可以看到。
built变量之前也看过了,就是调用了build方法的标志。
_metrics这块儿,准备留一个专题来写。现在,简单将它看作类似losses之类的东西就行。
136行,allowed_kwargs,用来控制允许的keyword参数。这种方法在python库中很常见,一是可以用来检查用户错误的输入,二是可以用来进行版本控制。比如,在tensorflow中,经常看到警告,说某个参数在未来将会被弃用。就是用这种方法实现的检查和警告。
这里显示了layer的默认命名方法。进入K.get_uid方法中看看。
哦,就是将该layer名称为key的value直接加1。这一点,查看model的summary时,那些layer的名称,能看的更明白一些。layer名称后面的数字,就表示了这个layer被实例化了多少次。
154行,trainable这个参数,如果不设置,默认就会设置成True。
155-175
这里看到,keras 会使用input_shape 和batch_size来拼出batch_input_shape。
按这里的方法,提供input_shape时,必须同时提供batch_size。可是平时在是使用Input时,并没有提供batch_size。于是,我跳到了Input的初始化中,一探究竟。
原来,这里直接用None拼接出了batch_input_shape。了然!
这里设置了数据类型,如果你没有设置,默认的是K.floatx()。
需要注意一下,这里有个_initial_weights,用来对weights进行初始化。
看一下它的使用时机。在__call__方法中。
可以看到,如果layer还没有build,就会使用这个weights进行初始化。如果已经build了,就不会再次初始化。这是我一开始感到迷惑的地方。
这__call__方法的调用时机,用一个例子来说明一下:
Dense(2)(a)
这里,就调用了Dense的__call__方法。
至此,阅读完了Layer的初始化方法。