Tensorflow 权重衰减的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010185894/article/details/71105639

在 tf.get_variable 这个函数中有一个命名参数为 regularizer,顾名思义,这个参数可用于正则化。在 Tensorflow 官网中,regularizer 的描述如下:

get_variable(
    name,
    shape=None,
    dtype=None,
    initializer=None,
    regularizer=None,
    trainable=True,
    collections=None,
    caching_device=None,
    partitioner=None,
    validate_shape=True,
    use_resource=None,
    custom_getter=None
)

regularizer: A (Tensor -> Tensor or None) function; the result of applying it on a newly created variable will be added to the collection tf.GraphKeys.REGULARIZATION_LOSSES and can be used for regularization.

在使用的时候,我们可以自定义一个函数,只要这个函数的输入参数和返回值都是 tensor,这个函数就能作为 regularizer 这个命名参数传入 get_variable 函数。例如我们可以定义如下的损失函数:

def regularizer(tensor):
    with tf.name_scope(scope, default_name='l2_regularizer', values=[tensor]):
        l2_weight = tf.convert_to_tensor(weight_decay, \
                                         dtype=tensor.dtype.base_dtype, \
                                         name='weight_decay')
        return tf.multiply(l2_weight, tf.nn.l2_loss(tensor), name='value')

我还没找到说明 tensor 这个参数的文档,猜测这个 tensor 传过来的变量就是 get_variable 这个函数的返回值,当我们用 get_variable 获取权重时,这个 tensor 就是权重,所以 regularizer 这个函数返回的就是一个 L2 正则项。

目前为止,我们仅仅是知道了这个参数的含义,但并不知道 Tensorflow 底层会怎样去使用这个参数。需要注意,Tensorflow 没有自动把这个正则项自动加到优化当中去,这意味着在构建 loss 阶段我们必须把正则项加入进去。

由官方文档可以知道,我们可以通过 tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) 获取正则项,这个函数得到的是由若干个类型为 tensor 的元素构成的 list。具体来说,如果我们为网络中的 n 个权重变量都加上 regularizer 这个参数,那么在我们应该得到 n 个对应的正则项,从而通过函数 tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) 能获取一个 n 个元素构成的 list,这里每一个元素分别对应不同的权重的正则项。

ufldl 的 Backpropagation Algorithm 可以知道在优化问题中,损失函数即为均方差以及所有权重的正则项之和,所以在构建 loss 时,我们只要把均方差与上述 tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) 的所有元素之和相加即可得到最终的 loss。

regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss = tf.add_n(regularization_losses) + loss
阅读更多
换一批

没有更多推荐了,返回首页