Tensorflow实战(4)-TensorFlow的正则化实现

2022-04-28 13:00:26 浏览数 (1)

在训练深度学习网络时,在损失函数上加上正则项是防止过拟合的一个重要方法。本文介绍两种在TensorFlow中如何加入正则化项的方法, 但无论何种方法大的逻辑都是:创建一个正则化方法;然后将这个正则化方法应用到变量上。

第一种方法:

这种方法对应与tf.get_variable初始化变量的方法。

步骤一:创建正则化方法:

代码语言:javascript复制
regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)

scale对应Loss函数中的alphaα, 增加正则化的目标函数如下:

其中alpha in [0, infty)α∈[0,∞)是权衡范数惩罚项OmegaΩ和标准目标函数J(theta; X, y)J(θ;X,y)相对贡献的超参数。alpha = 0α=0表示没有正则化,alphaα越大,对应的正则化惩罚越大。

步骤二: 将正则化的方法应用到变量上

代码语言:javascript复制
weights = tf.get_variable(
        name="weights",
        regularizer=l2_reg,
        ...
    )

步骤三: 定义加入了正则化惩罚项的目标函数

代码语言:javascript复制
reg_variables = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss  = tf.add_n(reg_variables)

第二种方法

这种方法对应与tf.Variable初始化变量的方法。

步骤一: 创建一个变量

代码语言:javascript复制
W = tf.Variable(tf.random_normal([128, 100, 100, 3]))

步骤二: 将该变量加入tf.GraphKeys.WEIGHTS集合

代码语言:javascript复制
tf.add_to_collection(tf.GraphKeys.WEIGHTS, W)

步骤三: 对tf.GraphKeys.WEIGHTS集合中所有变量进行正则化并求和,加入loss

代码语言:javascript复制
regularizer = tf.contrib.layers.l2_regularizer(scale)
reg_term = tf.contrib.layers.apply_regularization(regularizer)

loss = loss   reg_term

tf.contrib.layers.apply_regularization(regularizer, weights_list=None)函数其实有两个参数,第一个是正则化方法,第二个是想要执行正则化方法的变量列表,如果为None,则默认取tf.GraphKeys.WEIGHTS中的weight。当然也可以加入别的集合,只要在函数中指明要正则化的变量集合名字即可。

0 人点赞