ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

tensorflow 中的L1和L2正则化

2020-02-28 17:05:14  阅读:283  来源: 互联网

标签:sess run 0.5 l2 L2 L1 tf tensorflow weights


import tensorflow as tf
weights = tf.constant([[1.0, -2.0],[-3.0 , 4.0]])

>>> sess.run(tf.contrib.layers.l1_regularizer(0.5)(weights))
5.0
>>> sess.run(tf.keras.regularizers.l1(0.5)(weights))
5.0
>>> sess.run(tf.keras.regularizers.l1()(weights))
0.099999994
>>> sess.run(tf.keras.regularizers.l1(1)(weights))
10.0
>>> sess.run(tf.nn.l2_loss(weights))
15.0
>>> sess.run(tf.keras.regularizers.l2(1)(weights))
30.0
>>> sess.run(tf.keras.regularizers.l2(0.5)(weights))
15.0
>>> sess.run(tf.contrib.layers.l1_regularizer(0.5)(weights))
5.0
>>> sess.run(tf.contrib.layers.l2_regularizer(0.5)(weights))
7.5
>>> sess.run(tf.contrib.layers.l2_regularizer(1.0)(weights))
15.0

在tensorflow中,tf.nn中只有tf.nn.l2_loss,却没有l1_loss,于是自己网上查阅资料,了解到tf.contrib.layers中有tf.contrib.layers.l1_regularizer(),但是tf.contrib目前新版本已经被弃用了,后来发现tf.keras.regularizers下面有l1和l2正则化器,但是该正则化器的l2有点不一样,从上面的结果可以看出,scale都为1时,它要多一倍。可以查看源代码,tf.nn.l2_loss和 tf.contrib.layers.l2_regularizer 中都统一除以了2.所以值要少一半。

>>> sess.run(tf.nn.l2_loss(weights))
15.0
>>> sess.run(tf.keras.regularizers.l2(1)(weights))
30.0
>>> sess.run(tf.contrib.layers.l2_regularizer(1.0)(weights))
15.0
将scale设为0.5后,可以得到一样的值,因此,以后在损失函数中可以使用这样的方式来求l2损失和l1损失。
>>> sess.run(tf.keras.regularizers.l2(0.5)(weights))
15.0
参考了  day-17 L1和L2正则化的tensorflow示例 - 派森蛙 - 博客园

https://www.cnblogs.com/python-frog/p/9416970.html

'''
输入:
x = [[1.0,2.0]]
w = [[1.0,2.0],[3,0,4.0]]

输出:
y = x*w = [[7.0,10.0]]
l1 = (1.0+2.0+3.0+4.0)*0.5 = 5.0
l2 = (1.0**2 + 2.0**2 + 3.0**2 + 4.0**2) / 2)*0.5 = 7.5
'''

import tensorflow as tf
from tensorflow.contrib.layers import *

w = tf.constant([[1.0,2.0],[3.0,4.0]])
x = tf.placeholder(dtype=tf.float32,shape=[None,2])
y = tf.matmul(x,w)

with tf.Session()  as sess:
    init = tf.global_variables_initializer()
    sess.run(init)
    print(sess.run(y,feed_dict={x:[[1.0,2.0]]}))
    print("=========================")
    print(sess.run(l1_regularizer(scale=0.5)(w)))
    #(1.0+2.0+3.0+4.0)*0.5 = 5.0
    print("=========================")
    print(sess.run(l2_regularizer(scale=0.5)(w)))
    #(1.0**2 + 2.0**2 + 3.0**2 + 4.0**2) / 2)*0.5 = 7.5

 

标签:sess,run,0.5,l2,L2,L1,tf,tensorflow,weights
来源: https://www.cnblogs.com/Jerry-home/p/12377929.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有