如何在TensorFlow中添加正规化?

2024-04-25 21:39:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我在许多可用的神经网络代码中发现,使用TensorFlow实现的正则化项通常是通过在损失值中手动添加一个附加项来实现的。

我的问题是:

  1. 有没有比手动操作更优雅或更推荐的正则化方法?

  2. 我还发现get_variable有一个参数regularizer。该如何使用?根据我的观察,如果我们给它传递一个正则项(比如tf.contrib.layers.l2_regularizer),一个表示正则项的张量将被计算并添加到名为tf.GraphKeys.REGULARIZATOIN_LOSSES的图集合中。TensorFlow是否会自动使用该集合(例如,在培训时由优化器使用)?或者我应该自己使用这些收藏品?


Tags: 方法代码参数getlayerstftensorflow神经网络
3条回答

正如您在第二点中所说,建议使用regularizer参数。您可以在get_variable中使用它,或者在variable_scope中设置一次,并使所有变量正则化。

损失是在图表中收集的,您需要手动将它们添加到成本函数中,如下所示。

  reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
  reg_constant = 0.01  # Choose an appropriate one.
  loss = my_normal_loss + reg_constant * sum(reg_losses)

希望能有帮助!

我暂时还不清楚现有答案的几个方面,因此这里有一个循序渐进的指南:

  1. 定义正则化器。这是可以设置正则化常数的地方,例如:

    regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
    
  2. 通过以下方式创建变量:

        weights = tf.get_variable(
            name="weights",
            regularizer=regularizer,
            ...
        )
    

    等价地,变量可以通过正则的weights = tf.Variable(...)构造函数创建,然后是tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights)

  3. 定义一些loss项并添加正则化项:

    reg_variables = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
    reg_term = tf.contrib.layers.apply_regularization(regularizer, reg_variables)
    loss += reg_term
    

    注意:看起来tf.contrib.layers.apply_regularization是作为AddN实现的,所以或多或少相当于sum(reg_variables)

我会提供一个简单的正确答案,因为我没有找到。你需要两个简单的步骤,其余的由tensorflow magic完成:

  1. 创建变量或层时添加正则化:

    tf.layers.dense(x, kernel_regularizer=tf.contrib.layers.l2_regularizer(0.001))
    # or
    tf.get_variable('a', regularizer=tf.contrib.layers.l2_regularizer(0.001))
    
  2. 定义损失时添加正则化项:

    loss = ordinary_loss + tf.losses.get_regularization_loss()
    

相关问题 更多 >