首页 > 解决方案 > 如何在 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对自定义层的参数应用任何预定义的正则化(例如)或自定义正则化?

标签: pythontensorflowmachine-learningkerasregularized

解决方案


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


推荐阅读