tf.add_to_collection与tf.get_collection函数

tf.add_to_collection是把多个变量放入一个自己y用引号命名的集合里,也就是把多个变量统一放在一个列表中。

tf.get_collection与之相反,是从列表中取出所有元素,构成一个新的列表。

乍一看这个tf.get_collection好像没什么作用,前后都还是列表。其实这样做的原因如下:

举例:
之前用tf.add_to_collection将多个变量放在命名为‘regularizer’的域中,构成一个列表。而’regularizer’本身并不是列表,无法直接显示操作,只有用tf.get_collection作用到’regularizer’上后,得到的才是这个可操作的列表本身。

在深度学习中,通常用这几个函数存放不同层中的权值和偏置参数,也就是把所有可学习参数利用tf.contrib.layers.l2_regularizer(regular_num)(w)得到norm后,都放到’regular’的列表中作为正则项,然后使用tf.add_n函数将他们和原本的loss相加,得到含有正则的loss。

w = tf.get_variable('weight', dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer())
tf.add_to_collection('regularizer', tf.contrib.layers.l2_regularizer(regular_num=0.001)(w))

shared = tf.nn.conv2d(input, w, [1, stride, stride, 1], padding=padding)

b = tf.get_variable('bias', [out_dim], 'float32', initializer=tf.constant_initializer(0.))
tf.add_to_collection('regularizer', tf.contrib.layers.l2_regularizer(regular_num=0.001)(b))

out = tf.nn.bias_add(shared, b)

上面的是在定义conv2d时将参数w,b做L2正则后放到‘regularizer’中,下面是定义loss时调用‘regularizer’:

regular = tf.add_n(tf.get_collection('regularizer'), 'loss') 
# tf.add_n(inputs,name)
with tf.variable_scope(name='loss') as scope:
    loss = -tf.reduce_sum(label*tf.log(y)) + regular # cross entroy + L2-norm as the loss
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值