一、基础正则化函数

tf.contrib.layers.l1_regularizer(scale, scope=None)

返回一个用来执行L1正则化的函数,函数的签名是func(weights).

参数:

scale: 正则项的系数.

scope: 可选的scope name

tf.contrib.layers.l2_regularizer(scale, scope=None)

先看看tf.contrib.layers.l2_regularizer(weight_decay)都执行了什么:

import tensorflow as tf

sess=tf.Session()

weight_decay=0.1

tmp=tf.constant([0,1,2,3],dtype=tf.float32)

"""

l2_reg=tf.contrib.layers.l2_regularizer(weight_decay)

a=tf.get_variable("I_am_a",regularizer=l2_reg,initializer=tmp)

"""

#**上面代码的等价代码

a=tf.get_variable("I_am_a",initializer=tmp)

a2=tf.reduce_sum(a*a)*weight_decay/2;

a3=tf.get_variable(a.name.split(":")[0]+"/Regularizer/l2_regularizer",initializer=a2)

tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES,a2)

#**

sess.run(tf.global_variables_initializer())

keys = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)

for key in keys:

print("%s : %s" %(key.name,sess.run(key)))

我们很容易可以模拟出tf.contrib.layers.l2_regularizer都做了什么,不过会让代码变丑。

以下比较完整实现L2 正则化。

import tensorflow as tf

sess=tf.Session()

weight_decay=0.1 #(1)定义weight_decay

l2_reg=tf.contrib.layers.l2_regularizer(weight_decay) #(2)定义l2_regularizer()

tmp=tf.constant([0,1,2,3],dtype=tf.float32)

a=tf.get_variable("I_am_a",regularizer=l2_reg,initializer=tmp) #(3)创建variable,l2_regularizer复制给regularizer参数。

#目测REXXX_LOSSES集合

#regularizer定义会将a加入REGULARIZATION_LOSSES集合

print("Global Set:")

keys = tf.get_collection("variables")

for key in keys:

print(key.name)

print("Regular Set:")

keys = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)

for key in keys:

print(key.name)

print("--------------------")

sess.run(tf.global_variables_initializer())

print(sess.run(a))

reg_set=tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) #(4)则REGULARIAZTION_LOSSES集合会包含所有被weight_decay后的参数和,将其相加

l2_loss=tf.add_n(reg_set)

print("loss=%s" %(sess.run(l2_loss)))

"""

此处输出0.7,即:

weight_decay*sigmal(w*2)/2=0.1*(0*0+1*1+2*2+3*3)/2=0.7

其实代码自己写也很方便,用API看着比较正规。

在网络模型中,直接将l2_loss加入loss就好了。(loss变大,执行train自然会decay)

"""

二、添加正则化方法

a、原始办法

正则化常用到集合,下面是最原始的添加正则办法(直接在变量声明后将之添加进'losses'集合或tf.GraphKeys.LOESSES也行):

import tensorflow as tf

import numpy as np

def get_weights(shape, lambd):

var = tf.Variable(tf.random_normal(shape), dtype=tf.float32)

tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambd)(var))

return var

x = tf.placeholder(tf.float32, shape=(None, 2))

y_ = tf.placeholder(tf.float32, shape=(None, 1))

batch_size = 8

layer_dimension = [2, 10, 10, 10, 1]

n_layers = len(layer_dimension)

cur_lay = x

in_dimension = layer_dimension[0]

for i in range(1, n_layers):

out_dimension = layer_dimension[i]

weights = get_weights([in_dimension, out_dimension], 0.001)

bias = tf.Variable(tf.constant(0.1, shape=[out_dimension]))

cur_lay = tf.nn.relu(tf.matmul(cur_lay, weights)+bias)

in_dimension = layer_dimension[i]

mess_loss = tf.reduce_mean(tf.square(y_-cur_lay))

tf.add_to_collection('losses', mess_loss)

loss = tf.add_n(tf.get_collection('losses'))

b、tf.contrib.layers.apply_regularization(regularizer, weights_list=None)

先看参数

regularizer:就是我们上一步创建的正则化方法

weights_list: 想要执行正则化方法的参数列表,如果为None的话,就取GraphKeys.WEIGHTS中的weights.

函数返回一个标量Tensor,同时,这个标量Tensor也会保存到GraphKeys.REGULARIZATION_LOSSES中.这个Tensor保存了计算正则项损失的方法.

tensorflow中的Tensor是保存了计算这个值的路径(方法),当我们run的时候,tensorflow后端就通过路径计算出Tensor对应的值

现在,我们只需将这个正则项损失加到我们的损失函数上就可以了.

如果是自己手动定义weight的话,需要手动将weight保存到GraphKeys.WEIGHTS中,但是如果使用layer的话,就不用这么麻烦了,别人已经帮你考虑好了.(最好自己验证一下tf.GraphKeys.WEIGHTS中是否包含了所有的weights,防止被坑)

c、使用slim

使用slim会简单很多:

with slim.arg_scope([slim.conv2d, slim.fully_connected],

activation_fn=tf.nn.relu,

weights_regularizer=slim.l2_regularizer(weight_decay)):

pass

此时添加集合为tf.GraphKeys.REGULARIZATION_LOSSES。

tensorflow中的正则化函数在_『TensorFlow』正则化添加方法整理相关推荐

  1. python中setup是什么意思_『Python』setup.py简介

    setup.py应用场合 网上见到其他人这样介绍: 假如我在本机开发一个程序,需要用到python的redis.mysql模块以及自己编写的redis_run.py模块.我怎么实现在服务器上去发布该系 ...

  2. 【Tensorflow】Tensorflow中的卷积函数(conv2d、slim.conv2d、depthwise_conv2d、conv2d_transpose)

    [fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处] 前言   卷积是卷积神经网络中最主要.最重要的运算.想必大家最早接触卷积的概念就是在初高中 ...

  3. tensorflow中的norm()函数 | axis=0,axis=1,axis=2

    tensorflow中的norm函数作用是用来求L1_norm范数和Eukl_norm范数. 本篇文章主要目的是讲解axis的含义,所以默认都是用L1_norm范数,方便理解. 首先,来看一下2维的情 ...

  4. python中list作为函数参数_在python中list作函数形参,防止被实参修改的实现方法

    0.摘要 我们将一个list传入函数后,函数内部对实参修改后,形参也会随之改变.本文将主要介绍这种错误的现象.原因和解决方法. 1.代码示例 def fun(inner_lst): inner_lst ...

  5. tensorflow正则化添加方法整理

    一.基础正则化函数 tf.contrib.layers.l1_regularizer(scale, scope=None) 返回一个用来执行L1正则化的函数,函数的签名是func(weights).  ...

  6. 猪年快乐之TensorFlow中实现word2vec及如何结构化TensorFlow模型

    猪年快乐之TensorFlow中实现word2vec及如何结构化TensorFlow模型 导语 今天是2019年新年第一天,首先祝福大家猪年大吉,在新的一年里多多学习,多多锻炼,身体健康,万事如意! ...

  7. mysql 分页 去重_『备忘录』elasticsearch 去重分页查询

    一开始数据结构设计的很复杂,又是父子关系又是嵌套关系,结果发现不能通过简单的查询得到想要的结果:比如一个商店只出现一件符合条件的商品,弄得查询语句就变成这样了 curl -XPOST http://l ...

  8. tensorflow中的shape函数理解

    在tensorflow中经常用到shape函数 例如 import tensorflow as tf a = tf.constant([[1.,2.,3.],[4.,5.,6.],[7.,8.,9.] ...

  9. laravel控制器方法中,用函数作为变量进行传递时的处理方法

    本人在做上传图片时,里面执行的方法时一致的,只是个别地方不同,这种情况下,就需要把公用的部分提取出来,把不同的地方放到回调函数种去. StudentController中的方法: public fun ...

最新文章

  1. node.js写一个json服务
  2. 用一个创业故事串起操作系统原理(四)
  3. Exception in thread main java.io.IOException: No FileSystem for scheme: hdfs
  4. 国际人工智能算法与应用研讨会(WASA 2018)参会笔记
  5. Rocketmq集群工作流程
  6. Hive常见问题汇总
  7. 机器学习《西瓜书》EM算法公式推导+三硬币模型求解实例
  8. 个人博客网站的设计与实现_使用hexo来搭建个人网站博客(超详细教程)
  9. java adt eclipse_Eclipse安装ADT插件
  10. 我们应能在哪个层次使用计算机,福师20秋《计算机应用基础》在线作业一题目【标准答案】...
  11. 2021物理化学实验2:分光光度法测溴酚蓝的电离平衡常数
  12. OpenMV自学笔记
  13. 我用python做了个测词汇量的小工具
  14. google即将进入游戏产业
  15. 【调剂】福建师范大学海峡创新实验室覃弦接收调剂研究生
  16. Clojure Web开发–最新技术–第2部分
  17. Dart语言(一)--基础语法
  18. Go秒杀系统——RabbitMQ核心概念与工作模式
  19. JAVA-广联达-小朋友站队问题
  20. 攻防技术第二篇之-知己(防御手段)

热门文章

  1. 【备忘】Oracle商业智能BI产品OBIEE11G深入浅出全套视频教程
  2. Macbook安装win7和恢复系统的方法
  3. 华为、中兴短信网关最新3.0协议封装代码说明
  4. 深信服 VDS设备烤机
  5. Java,php,运维工程师转型大数据开发怎么样?你属于哪一类?
  6. 听说这两款是最适合程序员编程的电脑
  7. win10 语言栏跳出来,如何调回去
  8. VMware中Linux网络配置VMnet8还原默认配置不成功解决办法(亲测有效)
  9. 基于S52单片机的温度测量与报警装置
  10. 又猎一“狐”:一名外逃越南嫌疑人落网中