【问题标题】:How to apply kernel regularization in a custom layer in Keras/TensorFlow?如何在 Keras/TensorFlow 的自定义层中应用内核正则化?
【发布时间】:2020-11-26 21:40:33
【问题描述】:

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

【问题讨论】:

    标签: python tensorflow machine-learning keras regularized


    【解决方案1】:

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

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

    或者,要像其他内置层一样拥有更多控制权,您可以修改自定义层的定义并将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)
    

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

    【讨论】:

      猜你喜欢
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多