如何在 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 参数,它会被正确解析。