slim.arg_scope()
slim.arg_scope可以定义一些函数的默认参数值,在scope内,我们重复用到这些函数时可以不用把所有参数都写一遍,注意它没有tf.variable_scope()划分图结构的功能,
1 2 3 4 5 6 7 8 9 10 11 12 | with slim.arg_scope([slim.conv2d, slim.fully_connected], trainable = True , activation_fn = tf.nn.relu, weights_initializer = tf.truncated_normal_initializer(stddev = 0.01 ), weights_regularizer = slim.l2_regularizer( 0.0001 )): with slim.arg_scope([slim.conv2d], kernel_size = [ 3 , 3 ], padding = 'SAME' , normalizer_fn = slim.batch_norm): net = slim.conv2d(net, 64 , scope = 'conv1' )) net = slim.conv2d(net, 128 , scope = 'conv2' )) net = slim.conv2d(net, 256 , [ 5 , 5 ], scope = 'conv3' )) |
slim.arg_scope的用法基本都体现在上面了。一个slim.arg_scope内可以用list来同时定义多个函数的默认参数(前提是这些函数都有这些参数),另外,slim.arg_scope也允许相互嵌套。在其中调用的函数,可以不用重复写一些参数(例如kernel_size=[3, 3]),但也允许覆盖(例如最后一行,卷积核大小为[5,5])。
另外,还可以把这么多scope封装成函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def new_arg_sc(): with slim.arg_scope([slim.conv2d, slim.fully_connected], trainable = True , activation_fn = tf.nn.relu, weights_initializer = tf.truncated_normal_initializer(stddev = 0.01 ), weights_regularizer = slim.l2_regularizer( 0.0001 )): with slim.arg_scope([slim.conv2d], kernel_size = [ 3 , 3 ], padding = 'SAME' , normalizer_fn = slim.batch_norm) as sc: return sc def main(): ...... with slim.arg_scope(new_arg_sc()): ...... |
slim.utils.collect_named_outputs()
将变量取个别名,并收集到collection中
1 | net = slim.utils.collect_named_outputs(outputs_collections,sc.name,net) |
参数意义如下,
return:这个方法会返回本次添加的tensor对象,
参数二:意义是为tensor添加一个别名,并收集进collections中
查看源码可见实现如下
if collections:
append_tensor_alias(outputs,alias)
ops.add_to_collections(collections,outputs)
return outputs
据说本方法位置已经被转移到这里了,
from tensorflow.contrib.layers.python.layers import utils
utils.collect_named_outputs()
slim.utils.convert_collection_to_dict()
1 2 3 4 5 6 | #集合转换为字典,{节点名:输出张量值} end_points = slim.utils.convert_collection_to_dict(end_points_collection) |