我在使用TensorFlow实现的许多可用神经网络代码中发现,正则化术语通常通过手动向损失值添加附加项来实现 .
我的问题是:
-
有没有比手动更优雅或推荐的正规化方法?
-
我还发现
get_variable
有一个参数regularizer
. 该如何使用?根据我的观察,如果我们将正则化器传递给它(例如tf.contrib.layers.l2_regularizer
,将计算表示正则化术语的张量并将其添加到名为tf.GraphKeys.REGULARIZATOIN_LOSSES
的图表集合中.TensorFlow会自动使用该集合(例如,在训练时由优化器使用) ?或者我是否应该自己使用该系列?
8 回答
一些答案让我更加困惑 . 在这里,我给出了两种清晰的方法 .
然后,它可以添加到总损失中
正如您在第二点所述,建议使用
regularizer
参数 . 您可以在get_variable
中使用它,或者在variable_scope
中设置一次并使所有变量正规化 .损失收集在图表中,您需要手动将它们添加到您的成本函数中 .
希望有所帮助!
现有答案的几个方面对我来说并不是很清楚,所以这里有一个循序渐进的指南:
等价地,变量可以通过常规
weights = tf.Variable(...)
构造函数创建,然后是tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights)
.loss
术语并添加正则化术语:注意:看起来
tf.contrib.layers.apply_regularization
实现为AddN
,因此或多或少等同于sum(reg_variables)
.我会提供一个简单正确的答案,因为我找不到一个 . 你需要两个简单的步骤,其余的是由tensorflow魔术完成的:
使用
contrib.learn
库执行此操作的另一个选项如下,基于Tensorflow网站上的Deep MNIST tutorial . 首先,假设您已导入相关库(例如import tensorflow.contrib.layers as layers
),您可以使用单独的方法定义网络:然后,在main方法中,您可以使用以下代码段:
为了实现这一点,您需要遵循我之前链接的MNIST教程并导入相关库,但是学习TensorFlow是一个很好的练习,很容易看出正则化如何影响输出 . 如果将正则化应用为参数,则可以看到以下内容:
请注意,正则化部分根据可用项目为您提供三个项目 .
通过0,0.0001,0.01和1.0的正则化,我得到的测试精度值分别为0.9468,0.9476,0.9183和0.1135,显示了高正则化项的危险性 .
我在图中用
l2_regularizer
测试了tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
和tf.losses.get_regularization_loss()
,发现它们返回相同的值 . 通过观察值的数量,我猜通过设置tf.contrib.layers.l2_regularizer
的参数,reg_constant已经对值有意义了 .如果您有CNN,您可以执行以下操作:
在您的模型功能中:
在你的损失函数中: