环境: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()
方法中。