考虑以下来自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())
或者,为了像内置层那样有更多的控制,您可以修改自定义层的定义,并在__init__
方法中添加一个kernel_regularizer
参数:
from tensorflow.keras import regularizersclass 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)
这样,您甚至可以在构建层时向kernel_regularizer
参数传递像'l1'
或'l2'
这样的字符串,它将被正确解析。