在训练深度学习网络时,在损失函数上加上正则项是防止过拟合的一个重要方法。本文介绍两种在TensorFlow中如何加入正则化项的方法, 但无论何种方法大的逻辑都是:创建一个正则化方法;然后将这个正则化方法应用到变量上。
这种方法对应与tf.get_variable初始化变量的方法。
步骤一:创建正则化方法:
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α越大,对应的正则化惩罚越大。
步骤二: 将正则化的方法应用到变量上
weights = tf.get_variable(
name="weights",
regularizer=l2_reg,
...
)
步骤三: 定义加入了正则化惩罚项的目标函数
reg_variables = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss += tf.add_n(reg_variables)
这种方法对应与tf.Variable初始化变量的方法。
步骤一: 创建一个变量
W = tf.Variable(tf.random_normal([128, 100, 100, 3]))
步骤二: 将该变量加入tf.GraphKeys.WEIGHTS集合
tf.add_to_collection(tf.GraphKeys.WEIGHTS, W)
步骤三: 对tf.GraphKeys.WEIGHTS集合中所有变量进行正则化并求和,加入loss
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。当然也可以加入别的集合,只要在函数中指明要正则化的变量集合名字即可。