如何在 Keras/TensorFlow 的自定义层中应用内核正则化?
How to apply kernel regularization in a custom layer in Keras/TensorFlow?
考虑 TensorFlow 教程中的以下自定义层代码:
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
self.kernel = self.add_weight("kernel",
shape=[int(input_shape[-1]),
self.num_outputs])
def call(self, input):
return tf.matmul(input, self.kernel)
如何在自定义层的参数上应用任何预定义的正则化(比如 tf.keras.regularizers.L1
)或自定义正则化?
add_weight
方法采用 regularizer
参数,您可以使用该参数对权重应用正则化。例如:
self.kernel = self.add_weight("kernel",
shape=[int(input_shape[-1]), self.num_outputs],
regularizer=tf.keras.regularizers.l1_l2())
或者,要像其他 built-in 图层一样拥有更多控制权,您可以修改自定义图层的定义并向 __init__
方法添加 kernel_regularizer
参数:
from tensorflow.keras import regularizers
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs, kernel_regularizer=None):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
self.kernel_regularizer = regularizers.get(kernel_regularizer)
def build(self, input_shape):
self.kernel = self.add_weight("kernel",
shape=[int(input_shape[-1]), self.num_outputs],
regularizer=self.kernel_regularizer)
有了它,你甚至可以在构建层时将 'l1'
或 'l2'
之类的字符串传递给 kernel_regularizer
参数,它会被正确解析。
考虑 TensorFlow 教程中的以下自定义层代码:
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
self.kernel = self.add_weight("kernel",
shape=[int(input_shape[-1]),
self.num_outputs])
def call(self, input):
return tf.matmul(input, self.kernel)
如何在自定义层的参数上应用任何预定义的正则化(比如 tf.keras.regularizers.L1
)或自定义正则化?
add_weight
方法采用 regularizer
参数,您可以使用该参数对权重应用正则化。例如:
self.kernel = self.add_weight("kernel",
shape=[int(input_shape[-1]), self.num_outputs],
regularizer=tf.keras.regularizers.l1_l2())
或者,要像其他 built-in 图层一样拥有更多控制权,您可以修改自定义图层的定义并向 __init__
方法添加 kernel_regularizer
参数:
from tensorflow.keras import regularizers
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs, kernel_regularizer=None):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
self.kernel_regularizer = regularizers.get(kernel_regularizer)
def build(self, input_shape):
self.kernel = self.add_weight("kernel",
shape=[int(input_shape[-1]), self.num_outputs],
regularizer=self.kernel_regularizer)
有了它,你甚至可以在构建层时将 'l1'
或 'l2'
之类的字符串传递给 kernel_regularizer
参数,它会被正确解析。