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

use*_*983 6 python machine-learning regularized 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)
Run Code Online (Sandbox Code Playgroud)

tf.keras.regularizers.L1如何对自定义层的参数应用任何预定义的正则化(例如)或自定义正则化?

tod*_*day 13

add_weight方法采用一个regularizer参数,您可以使用该参数对权重应用正则化。例如:

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

或者,要像其他内置层一样进行更多控制,您可以修改自定义层的定义并向方法添加kernel_regularizer参数__init__

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)
Run Code Online (Sandbox Code Playgroud)

这样,您甚至可以在构造图层时将类似'l1'或 的字符串传递'l2'给参数,并且它会被正确解析。kernel_regularizer