我想将L1和L2正则化添加到我的损失函数中。当我定义权重变量时,我选择要使用的正则化,但似乎我只能选择一个。
regLosses=tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(y_conv,y_))+regLosses
当我试图通过
手动获得损失时weights=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
l1Loss=tf.reduce_sum(tf.abs(weights))
l2Loss=tf.nn.l2loss(weights)
loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(y_conv,y_))+.1*l1Loss+.001*l2Loss
它不起作用 - 我认为因为TRAINABLE_VARIABLES返回变量而不是参数。我该如何解决?我的l1损失的手动计算是否正确?
提前致谢
答案 0 :(得分:0)
所以我想我发现了答案。评论和评论欢迎。
当我创建权重时,我使用:
W=tf.get_variable(name=name,shape=shape,regularizer=tf.contrib.layers.l1_regularizer(1.0))
注意到l1正则化只是权重绝对值的总和,而l2是权重的平方,那么我可以做到以下几点。
regLosses=tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
l1=tf.reduce_sum(tf.abs(regLosses))
l2=tf.reduce_sum(tf.square(reglosses))