这篇博客的目的是利用keras自定义Layer实现类似Lamda层中w1x+w2y的功能,只不过这个w1和w2由网络训练得到,下面是本人亲测的实现。
import keras.engine as KE
class ClassifierLayer(KE.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def build(self, input_shape):
self.w1 = self.add_weight(shape=(1,), name="kernel1", trainable=True, initializer=KI.random_uniform(minval=0, maxval=1.0))
self.w2 = self.add_weight(shape=(1,), name="kernel2", trainable=True, initializer=KI.random_uniform(minval=0, maxval=1.0))
super().build(input_shape)
def call(self, inputs, **kwargs):
return self.w1 * inputs[0] + self.w2 * inputs[1]
def compute_output_shape(self, input_shape):
return input_shape
调用的时候直接和那些Conv2D Layer的调用一样,即:
x = ClassifierLayer(name="scores_add")([score1, score2])
用Netron打开H5模型,可以看到我们自定义的层及其可学习的参数。(名字是我专门改的,所以和代码对不上)