环境:tensorflow 2.0.0
Tensorflow实现自定义Layer时,所有的权重一定得在build()方法中通过self.add_weight()添加吗?
不一定。self.add_weight()是最直观但也是最原始的方法,定义起来功能不够灵活。可以在build()方法中,直接应用Layer,比如Dense。
举个例子,我们自定义Layer实现Dense层的功能,下面分别呈现利用self.add_weight()实现以及直接调用Dense()实现的代码:
| 12
 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
 
 | 
| 12
 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()方法中。