如何在Keras/TensorFlow的自定义层中应用核正则化?

6

考虑以下来自 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)或自定义正则化?

1个回答

13

add_weight 方法接受一个 regularizer 参数,您可以使用它来对权重进行正则化。例如:

self.kernel = self.add_weight("kernel",
                               shape=[int(input_shape[-1]), self.num_outputs],
                               regularizer=tf.keras.regularizers.l1_l2())

或者,为了像其他内置层一样拥有更多的控制权,您可以修改自定义层的定义,并向__init__方法添加一个kernel_regularizer参数:

或者,要像其他内置层那样具有更多控制权,您可以修改自定义层的定义并在__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 参数,它会被正确解析。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接