函数式API从一个例子开始
from keras.layers import *
x = Input(shape=(10, ))
y = Dense(10)(x)
正常情况下怎么使用类实例
可能你对上面的例子感到习以为常,但是看看正常情况下是怎样使用类的
class A(object):
def __init__(self, var):
self.var = var
def printf(self):
print(self.var)
a = A(0)
a.printf()
>> 0
什么不一样
函数式API的调用中Dense(10)(x)是不是没有指定方法
就调用方法了
发生了什么
- 首先
Dense(10)
会产生一个Dense类的实例,其实这一步也是没有通过调用方法的情况下调用了一个方法 Dense(10)(x)
是函数实例在不通过方法调用
的情况下调用了一个方法,即没有像上面这个实例a那样显式的调用printf
方法
是不是相到了Python里面一个叫做魔法方法
的东西
怎么做到的
通过__call__
class A(object):
def __init__(self, var):
self.var = var
def __call__(self, x):
print(x)
a = A(1)
a(3)
>>> 3
keras的__call__
自定义keras层
官方文档对于自定义层的描述
有3个需要重写的方法
- build
- call
- compute_output_shape
为什么需要重写这三个方法?因为计算逻辑都写在了Layer这个基类的__call__中了
可以不重写这三个方法吗
请继承Layer,并重写__call__,就像keras的Bidirectional做的那样