在训练深度学习网络时,在损失函数上加上正则项是防止过拟合的一个重要方法。本文介绍两种在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。当然也可以加入别的集合,只要在函数中指明要正则化的变量集合名字即可。