TianduAI

Action speak louder than words

0%

Tensorflow自定义Layer只能用add_weight定义权重吗?

环境: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
# self.add_weight()实现
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
# 调用Dense层实现
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()方法中。