环境:tensorflow 2.0.0
Tensorflow实现自定义Layer时,所有的权重一定得在build()方法中通过self.add_weight()添加吗?
不一定。self.add_weight()是最直观但也是最原始的方法,定义起来功能不够灵活。可以在build()方法中,直接应用Layer,比如Dense。
举个例子,我们自定义Layer实现Dense层的功能,下面分别呈现利用self.add_weight()实现以及直接调用Dense()实现的代码:
1 2 3 4 5 6 7 8 9 10 11 12
| class myLayer(tf.keras.layers.Layer): def __init__(units=1): super(myLayer, self).__init__() self.units = units
def build(self, input_shape): self.w = self.add_weight(shape=(input_shape[-1], self.units)) self.b = self.add_weight(shape=(units,))
def call(self, inputs): return tf.matmul(inputs, self.w) + self.b
|
1 2 3 4 5 6 7 8 9 10 11
| class myLayer(tf.keras.layers.Layer): def __init__(units=1): super(myLayer, self).__init__() self.units = units
def build(self, input_shape): self.dense = tf.keras.layers.Dense(units=self.units) def call(self, inputs): return self.dense(inputs)
|
可以看到,在build()中直接调用官方提供的Dense层在灵活性以及功能性上都有较大优势。
不过,要遵循一个原则,涉及到权重初始化的操作均应定义在build()中,不能出现在call()方法中。