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