tensorflow2添加regularization

l1,l2 regularization

摘自tensorflow_core.python.keras.regularizers的class Regularizer:

Regularizers allow you to apply penalties on layer parameters or
layer activity during optimization.These penalties are summed into the
loss function that the network optimizes.

正则项可以在optimizer优化时对layer中的参数或者layer activity添加惩罚项,这些惩罚项最后会加到optimizer所优化的loss function里

在隐藏层中经常会使用正则来作为损失函数的惩罚项。换言之,为了约束w的可能取值空间从而防止过拟合,我们为该最优化问题加上一个约束,就是w的L1范数或者L2范数不能大于给定值。

tf.keras.regularizers提供了几种内置类来提供正则。分别是class L1、class L1L2、class L2、class Regularizer 、serialize。同时提供了三个参数作为可被正则化的对象:

Regularization penalties are applied on a per-layer basis. The exact
API will depend on the layer, but many layers (e.g. DenseConv1D,
Conv2D and Conv3D) have a unified API.
These layers expose 3 keyword arguments:

  • kernel_regularizer: Regularizer to apply a penalty on the layer’s kernel
  • bias_regularizer: Regularizer to apply a penalty on the layer’s bias
  • activity_regularizer: Regularizer to apply a penalty on the layer’s output

在每层基础上应用这个正则化惩罚,确切的API由该层决定,但是DenseConv1DConv2D and
Conv3D这些层有统一的API,有三种参数:

  • kernel_regularizer:对该层中的权值矩阵layer.weights正则
  • bias_regularizer:对该层中的偏差矩阵layer.bias正则
  • activity_regularizer:对该层的输出值矩阵layer.bias正则
  1. 大多数情况下,使用kernel_regularizer就足够了;
  2. 如果你希望输入和输出是接近的,你可以使用bias_regularizer
  3. 如果你希望该层的输出尽量小,你应该使用activity_regularizer

在构造网络层时,将’kernel_regularizer’参数设为l2正则化函数,则tensorflow会将该权重变量(卷积核)的l2正则化项加入到集合 tf.GraphKeys.REGULARIZATOIN_LOSSES里。
在计算loss时使用tf.get_collection()来获取tf.GraphKeys.REGULARIZATOIN_LOSSES集合,然后相加即可:

l2_loss = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)

参考链接:

 理解L1和L2正则化为什么能防止过拟合_潜行隐耀的博客-CSDN博客

 

添加L2正则化,您可以在模型的损失函数中添加一个称为“L2损失”的项。L2损失是所有权重的平方和的乘积,然后乘以一个正则化系数lambda。这将强制模型权重保持较小的值,从而减少过拟合的风险。您可以使用以下伪代码来实现这个过程: ``` import tensorflow as tf # 定义模型 model = tf.keras.Sequential([ # 添加层 ]) # 定义损失函数和优化器 loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) optimizer = tf.keras.optimizers.Adam() # 添加L2正则化 lambda_val = 0.01 # 在损失函数中添加L2损失项 @tf.function def loss_with_regularization(model, x, y): logits = model(x) loss = loss_fn(y_true=y, y_pred=logits) l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in model.trainable_variables]) total_loss = loss + lambda_val * l2_loss return total_loss # 训练模型 train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32) for epoch in range(num_epochs): for x_batch, y_batch in train_ds: with tf.GradientTape() as tape: loss = loss_with_regularization(model, x_batch, y_batch) grads = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) ``` 在这个例子中,我们使用TensorFlow Keras API来构建模型,然后定义了一个新的损失函数“loss_with_regularization”,它计算原始损失函数的值,并添加了一个L2损失项。请注意,L2正则化的强度由lambda_val参数控制。您可以根据需要调整它的值,以获得更好的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值